glCopyTexSubImage2D - 复制二维纹理子图像
void
glCopyTexSubImage2D
( GLenum
target
,
GLint
level
,
GLint
xoffset
,
GLint
yoffset
,
GLint
x
,
GLint
y
,
GLsizei
width
,
GLsizei
height
);
target
指定活动纹理单元的目标纹理。必须是
GL_TEXTURE_2D
,
GL_TEXTURE_CUBE_MAP_POSITIVE_X
,
GL_TEXTURE_CUBE_MAP_NEGATIVE_X
,
GL_TEXTURE_CUBE_MAP_POSITIVE_Y
,
GL_TEXTURE_CUBE_MAP_NEGATIVE_Y
,
GL_TEXTURE_CUBE_MAP_POSITIVE_Z
或
GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
。
level
指定详细级别。 0级是基本图像级别。级别n是第n个mipmap缩小图像。
指定要复制的像素矩形区域左下角的窗口坐标。
width
指定纹理图像的宽度。所有实现都支持至少64个纹素宽的2D纹理图像和至少16个纹素宽的立方体映射纹理图像。
height
指定纹理图像的高度。所有实现都支持至少64个纹素高的2D纹理图像和至少16个纹素高的立方体映射纹理图像。
xoffset
指定纹理数组中x方向的纹素偏移。
yoffset
指定纹理数组内y方向的纹素偏移量。
纹理将指定纹理图像的一部分映射到纹理处于活动状态的每个图元上。当前片段着色器或顶点着色器使用内置纹理查找功能时,纹理处于活动状态。
glCopyTexSubImage2D
用当前帧缓冲区中的像素(而不是客户端内存,如
glTexSubImage2D
的情况)替换二维纹理图像或立方体贴图纹理图像的矩形部分。
屏幕对齐的像素矩形,左下角为(
x,y
),宽度为
width
,高度为
height
,定义了由
level
指定的
mipmap
级别的纹理数组。
处理矩形中的像素就像调用
format
设置为
GL_RGBA
的
glReadPixels
一样,但是在转换RGBA值之后,该过程就会停止。后续处理与
glTexSubImage2D
描述的处理相同,首先将R,G,B和A值截断到0 1范围,然后转换为纹理的内部格式以存储在纹素阵列中。
纹理数组中的目标矩形可能不包括最初指定的纹理数组外的任何纹理像素。指定宽度或高度为零的子纹理不是错误,但这样的规范没有效果。
如果指定矩形内的任何像素位于与当前渲染上下文关联的帧缓冲区之外,则为这些像素获取的值为未定义的。
不会对指定纹理数组的
internalformat
,
width
或
height
参数或指定子区域外的纹素值进行更改。
glCopyTexSubImage2D
为使用
glActiveTexture
指定的当前纹理单元指定二维或立方体贴图纹理。
GL_INVALID_ENUM
:
target
不是
GL_TEXTURE_2D
,
GL_TEXTURE_CUBE_MAP_POSITIVE_X
,
GL_TEXTURE_CUBE_MAP_NEGATIVE_X
,
GL_TEXTURE_CUBE_MAP_POSITIVE_Y
,
GL_TEXTURE_CUBE_MAP_NEGATIVE_Y
,
GL_TEXTURE_CUBE_MAP_POSITIVE_Z
或
GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
。
GL_INVALID_ENUM
:
internalformat
不是可接受的格式。
GL_INVALID_VALUE
:
target
是六个立方体贴图2D图像目标之一并且
width
和
height
参数不相等。
GL_INVALID_VALUE
:
level
小于0。
GL_INVALID_OPERATION
:纹理数组尚未由先前的
glTexImage2D
或
glCopyTexImage2D
操作定义。
GL_INVALID_OPERATION
:当前绑定的帧缓冲区格式不包含
internalformat
基本格式所需组件的
超集
。
GL_INVALID_FRAMEBUFFER_OPERATION
:当前绑定的帧缓冲不是帧缓冲完成(即
glCheckFramebufferStatus
的返回值不是
GL_FRAMEBUFFER_COMPLETE
)
相关Gets
glGet
参数
GL_MAX_TEXTURE_SIZE
或
GL_MAX_CUBE_MAP_TEXTURE_SIZE
glActiveTexture
,
glCheckFramebufferStatus
,
glCopyTexImage2D
,
glTexImage2D
,
glTexParameter
,
glTexSubImage2D
https://www.khronos.org/registry/OpenGL-Refpages/es2.0/xhtml/glCopyTexSubImage2D.xml
https://blog.csdn.net/flycatdeng
Android,OpenGL ES,图形学
名称glCopyTexSubImage2D - 复制二维纹理子图像C规范void glCopyTexSubImage2D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GL...
对于简单的纹理复制需求,使用
gl
Copy
Tex
Sub
Image
2D
可以实现。不过前段时间碰到一个怪异的现象,
gl
Copy
Tex
Sub
Image
2D
()执行耗费了数秒钟才完成,每次如此。折腾了几天也找不着原因。后来换成使用FBO来拷贝就正常。使用FBO还有一个好处就是可以对画面进行拉伸处理。记录如下。
使用
gl
Copy
Tex
Sub
Image
2D
函数:
// ...
GL
int lastBuffer;
gl
GetIntegerv(
GL
_READ_BUFFER, &lastBuffer);
gl
Re
gl
Tex
Sub
Image
2D
,
gl
Tex
ture
Sub
Image
2D
— specify a two-dimensional
tex
ture
sub
image
C Specification
void
gl
Tex
Sub
Image
2D
(
GL
enum target,
GL
int level,
GL
int xoffset,
GL
int yoffset,
GL
sizei width,
GL
sizei height,
GL
enum format,
GL
enum type,
const void * p
定义一个二维纹理:
gl
Tex
Image
2D
(
GL
_
TEX
TURE_
2D
, 0,
GL
_RGBA, check
Image
Width, check
Image
Height,
0,
GL
_RGBA,
GL
_UNSIGNED_BYTE, check
Image
);
void
gl
Tex
Image
2D
(
GL
enum target,
GL
int level, G
gl
Tex
Image
2D
函数
gl
Tex
Image
2D
(
GL
enum target,
GL
int level,
GL
int internalformat,
GL
sizei width,
GL
sizei height,
GL
int border,
GL
enum format,
GL
enum type, const
GL
void *pixels);
gl
Tex
Image
2D
(
private ByteBuffer
tex
tureToByteBuffer(int
tex
tureId) { int currentFrameid[] = new int[1];
GLES2
0.
gl
GetIntegerv(
GLES2
0.
GL
_FRAMEBUFFER_BINDING, currentFrameid, 0); if (mFrameBuffers == null) return null;
GLES2
0.
gl
BindFramebuffer(
GLES2
0.
GL
_FRAMEBUFFER, mFrameBuffers[0]);
GLES2
0.
gl
Viewport(0, 0, mOutputWidth, mOutputHeight);
GLES2
0.
gl
UseProgram(m
GL
ProgId); if (!mIsInitialized) { return null; } m
GL
CubeBuffer.position(0);
GLES2
0.
gl
Ver
tex
AttribPointer(m
GL
AttribPosition, 2,
GLES2
0.
GL
_FLOAT, false, 0, m
GL
CubeBuffer);
GLES2
0.
gl
EnableVer
tex
AttribArray(m
GL
AttribPosition); m
GL
Tex
tureBuffer.position(0);
GLES2
0.
gl
Ver
tex
AttribPointer(m
GL
Attrib
Tex
tureCoordinate, 2,
GLES2
0.
GL
_FLOAT, false, 0, m
GL
Tex
tureBuffer);
GLES2
0.
gl
EnableVer
tex
AttribArray(m
GL
Attrib
Tex
tureCoordinate); //
GLES2
0.
gl
UniformMatrix4fv(m
Tex
tureTransformMatrixLocation, 1, false, m
Tex
tureTransformMatrix, 0); if (
tex
tureId != Open
gl
Util.NO_
TEX
TURE) {
GLES2
0.
gl
Active
Tex
ture(
GLES2
0.
GL
_
TEX
TURE0);
GLES2
0.
gl
Bind
Tex
ture(
GLES2
0.
GL
_
TEX
TURE_
2D
,
tex
tureId);
GLES2
0.
gl
Uniform1i(m
GL
Uniform
Tex
ture, 0); }
GLES2
0.
gl
DrawArrays(
GLES2
0.
GL
_TRIAN
GL
E_STRIP, 0, 4); //
GLES
10.
gl
Rotatef(90,3.0f,3.0f,3.0f); readCompressBuffer.clear(); long time1 = System.currentTimeMillis();
GLES2
0.
gl
ReadPixels(0, 0, mOutputWidth, mOutputHeight,
GLES2
0.
GL
_RGBA,
GLES2
0.
GL
_UNSIGNED_BYTE, readCompressBuffer); Log.e("xie", "
tex
tureToByteBuffer: readtime" + (System.currentTimeMillis() - time1));
GLES2
0.
gl
DisableVer
tex
AttribArray(m
GL
AttribPosition);
GLES2
0.
gl
DisableVer
tex
AttribArray(m
GL
Attrib
Tex
tureCoordinate);
GLES2
0.
gl
Active
Tex
ture(
GLES2
0.
GL
_
TEX
TURE0);
GLES2
0.
gl
Bind
Tex
ture(
GLES2
0.
GL
_
TEX
TURE_
2D
, 0);
GLES2
0.
gl
BindFramebuffer(
GLES2
0.
GL
_FRAMEBUFFER, currentFrameid[0]); //
GLES2
0.
gl
Viewport(0, 0,mOutputWidth , mOutputHeight); return readCompressBuffer; }
Android生成文件失败:java.lang.IllegalStateException:Failed to build unique file: /storage/emulated/0/...
Android Canvas : 2 基础绘制