相关文章推荐
爱逃课的毛豆  ·  Tap/Tun for Debian ...·  6 月前    · 
沉稳的电梯  ·  sparkSQL中partition ...·  1 年前    · 

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 基础绘制