是glTexImage2D和glTexSubImage2D像素的缓冲区传递到纹理的唯一途径?
目前我在设置函数glTexImage2D中使用null作为缓冲区,然后在渲染循环中,我在每次迭代时使用新的缓冲区数据调用glTexSubImage2D.
但是知道纹理不会改变任何属性(如尺寸),是否有更有效的方法将实际像素数据传递给渲染纹理?
这两个功能有什么区别?任何性能差异?
谢谢..
例如,我创建一个像素数组,如下所示:
int *getPixels()
{
int *pixels = new int[10];
pixels[0] = 1;
pixels[1] = 0;
pixels[1] = 1;
// etc...
}
glTexImage2D(..., getPixels());
Run Code Online (Sandbox Code Playgroud)
glTexImage2D是否使用该引用或将像素复制到自己的内存中?
如果答案是前者,那么我应该做以下事情吗?
int *p = getPixels();
glTexImage2D(..., p);
/* Just changed to delete[], because delete
* would only delete the first element! */
delete[] p;
Run Code Online (Sandbox Code Playgroud) glBindImageTexture和glBindTexture有什么区别?并且着色器中的以下声明之间的区别是什么:
layout (binding = 0, rgba32f) uniform image2D img_input;
Run Code Online (Sandbox Code Playgroud)
和
uniform sampler2D img_input;
Run Code Online (Sandbox Code Playgroud) 与我的其他问题相关,我认为更重要的问题是,如何QImage使用OpenGL 渲染?
我认为代码必须看起来像这样,但我不确定我还需要什么,除此之外convertToGLFormat(img).
glEnable(GL_TEXTURE_2D);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glGenTextures(1, &offscreenBufferTexture);
glBindTexture(GL_TEXTURE_2D, offscreenBufferTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imgGL.width(),
imgGL.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE,
imgGL.bits());
glBegin(GL_QUADS);
glTexCoord2d(0,0); glVertex2d(0, 0);
glTexCoord2d(1,0); glVertex2d(windowSize.width(), 0);
glTexCoord2d(1,1); glVertex2d(windowSize.width(), windowSize.height());
glTexCoord2d(0,1); glVertex2d(0, windowSize.height());
glEnd();
glDisable(GL_TEXTURE_2D);
Run Code Online (Sandbox Code Playgroud)
此外,我认为你可以使用快速和脏glDrawPixels()(虽然你不应该),像
glDrawPixels(imgGL.width(), imgGL.height(), GL_RGBA,
GL_UNSIGNED_BYTE, imgGL.bits());
Run Code Online (Sandbox Code Playgroud)
但无论哪种方式,我都看不到图像,只是一个白色正方形的大小.我在这里遗漏了一些东西.
我不完全理解在GPU上访问纹理数据的方式.如果可能的话 - 有人能解释一下吗?
当纹理单元的数量有限时,这是否会限制我可以使用生成的纹理数量glGenTextures()并使用上传到GPU glTexImage2D()?或者它只限制可以绑定的纹理单元的数量glBindTexture()?
我真正想做的是能够将我的所有纹理上传到GPU - 即使有超过可用纹理单元的数量.当需要纹理时,我只需使用它将其绑定到纹理单元glBindTexture().这可能吗?
我的代码只是将一些人为的数据上传到纹理:
glActiveTexture(GL_TEXTURE0+gl_sim_texture_active_n);
glBindTexture(GL_TEXTURE_2D, gl_sim_texture_buff_id);
for(int i = 0; i < w*h; i++) buff[i] = 0xAB;
glTexImage2D(GL_TEXTURE_2D,0,GL_ALPHA,w,h,0,GL_ALPHA,GL_UNSIGNED_BYTE,buff);
Run Code Online (Sandbox Code Playgroud)
和我的着色器中仅从该纹理中采样的代码:
uniform vec2 viewport;
uniform sampler2D sim_texture;
void main()
{
vec2 tex_uv = vec2(gl_FragCoord.x/(viewport.x-1.),gl_FragCoord.y/(viewport.y-1.));
gl_FragColor = texture2D(sim_texture,tex_uv).argb; //swizzle is to just put 'a' in a visibly renderable position as "redness"
}
Run Code Online (Sandbox Code Playgroud)
在OSX和Android上,这个纹理在我的着色器中是可读的(通过sampler2D-没什么花哨的) - 它可以工作.在iOS上,vec4(0.,0.,0.,1.)无论放入何种数据,来自该sampler2D的任何样本都会返回.
(请注意,当我更改GL_ALPHA为GL_RGBA,将纹理附加到帧缓冲区,然后glReadPixels在glTexImage2D我确实获取我输入的确切数据后调用,无论平台如何,并且功能(或iOS上的缺乏)保持不变.切换到GL_RGBA只需将它附加到帧缓冲区,这是必要的glReadPixels,我只关心调试目的.tl; dr:我有理由相信数据正在所有平台上正确上传到纹理.)
其他信息:
gl_sim_texture_active_n是6,gl_sim_texture_buff_id是14(都是合法获得的,没有错误).呼叫glGetError()或glCheckFramebufferStatus(GL_FRAMEBUFFER)在两者之前或之后返回清洁.glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS) …
我正在使用使用OpenGL纹理的Mac应用程序,该纹理是使用glTexImage2D从磁盘上的图像文件加载的。
根据文档,对于OpenGL版本> = 2.0,纹理可以是任意大小。(对于版本<2.0,x和y尺寸都必须为2的幂。)
但是,如果我的图像尺寸不是4的偶数倍,则纹理会变差。我已经进行了搜索和搜索,但是找不到有关此要求的任何文档。实际上,“红皮书”明确指出,纹理尺寸可以是> = 2.0版本的任何值。
我想念什么?
而且,将纹理转换为下一个最大的2幂次方是否有性能优势?我的应用程序需要Mac OS 10.6.6或更高版本,该操作系统应可在任何Intel Mac上运行。某些早期的Intel macs具有非常“不起眼”的图形硬件。
任何帮助将不胜感激。
我试图在着色器中上传带有unsigned short的纹理,但它不起作用.
我尝试过以下方法:
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, vbt[1]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 640, 480, 0, GL_RED, GL_UNSIGNED_SHORT, kinect_depth);
glUniform1i(ptexture1, 1);
GLenum ErrorCheckValue = glGetError();
Run Code Online (Sandbox Code Playgroud)
我知道我正确地绑定了纹理,因为我通过使用获得了一些结果
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, vbt[1]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 640, 480, 0,
GL_RG, GL_UNSIGNED_BYTE, kinect_depth);
glUniform1i(ptexture1, 1);
GLenum ErrorCheckValue = glGetError();
Run Code Online (Sandbox Code Playgroud)
特别是,我在红色通道中获得了部分值.我想将纹理上传为无符号字节或浮点数.但是我没有设法正确地获得glTexImage2D调用.此外,是否可以使用深度纹理类似的东西?我想对从kinect获得的深度信息进行一些操作并显示它.
int width, height;
BYTE * data;
FILE * file;
// open texture data
file = fopen( filename, "rb" );
if ( file == NULL ) return 0;
// allocate buffer
width = 256;
height = 256;
data =(BYTE*) malloc( width * height * 3 );
// read texture data
fread( data, width * height * 3, 1, file );
fclose( file );
glGenTextures( 1, &texture );
glBindTexture( GL_TEXTURE_2D, texture );
//gluBuild2DMipmaps( GL_TEXTURE_2D, 3, width, height, GL_RGB, GL_UNSIGNED_BYTE, data ); …Run Code Online (Sandbox Code Playgroud)