标签: glteximage2d

使用glTexImage2D在OpenGL中更新纹理

是glTexImage2D和glTexSubImage2D像素的缓冲区传递到纹理的唯一途径?

目前我在设置函数glTexImage2D中使用null作为缓冲区,然后在渲染循环中,我在每次迭代时使用新的缓冲区数据调用glTexSubImage2D.

但是知道纹理不会改变任何属性(如尺寸),是否有更有效的方法将实际像素数据传递给渲染纹理?

textures glteximage2d

15
推荐指数
1
解决办法
2万
查看次数

OpenGL中glTexSubImage和glTexImage函数的区别

这两个功能有什么区别?任何性能差异?

谢谢..

opengl glteximage2d

12
推荐指数
1
解决办法
1万
查看次数

将像素传递给glTexImage2D()后会发生什么?

例如,我创建一个像素数组,如下所示:

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)

c++ opengl glteximage2d

10
推荐指数
1
解决办法
3982
查看次数

glBindImageTexture()和glBindTexture()有什么区别?

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)

opengl texture2d glteximage2d

10
推荐指数
1
解决办法
2650
查看次数

使用OpenGL渲染QImage

与我的其他问题相关,我认为更重要的问题是,如何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)

但无论哪种方式,我都看不到图像,只是一个白色正方形的大小.我在这里遗漏了一些东西.

c++ opengl qt glteximage2d qimage

6
推荐指数
1
解决办法
8526
查看次数

在OpenGL中如何在GPU上访问纹理数据?

我不完全理解在GPU上访问纹理数据的方式.如果可能的话 - 有人能解释一下吗?

  1. 当纹理单元的数量有限时,这是否会限制我可以使用生成的纹理数量glGenTextures()并使用上传到GPU glTexImage2D()?或者它只限制可以绑定的纹理单元的数量glBindTexture()?

  2. 我真正想做的是能够将我的所有纹理上传到GPU - 即使有超过可用纹理单元的数量.当需要纹理时,我只需使用它将其绑定到纹理单元glBindTexture().这可能吗?

opengl texture-mapping glteximage2d multitexturing

5
推荐指数
1
解决办法
352
查看次数

gl纹理采样器总是在iOS上返回vec4(0,0,0.1,1.)(但在OSX/Android上运行)

我的代码只是将一些人为的数据上传到纹理:

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) …

glteximage2d ios opengl-es-2.0

5
推荐指数
1
解决办法
124
查看次数

OpenGL版本&gt; = 2.0是否要求纹理尺寸为4像素的倍数?

我正在使用使用OpenGL纹理的Mac应用程序,该纹理是使用glTexImage2D从磁盘上的图像文件加载的。

根据文档,对于OpenGL版本> = 2.0,纹理可以是任意大小。(对于版本<2.0,x和y尺寸都必须为2的幂。)

但是,如果我的图像尺寸不是4的偶数倍,则纹理会变差。我已经进行了搜索和搜索,但是找不到有关此要求的任何文档。实际上,“红皮书”明确指出,纹理尺寸可以是> = 2.0版本的任何值。

我想念什么?

而且,将纹理转换为下一个最大的2幂次方是否有性能优势?我的应用程序需要Mac OS 10.6.6或更高版本,该操作系统应可在任何Intel Mac上运行。某些早期的Intel macs具有非常“不起眼”的图形硬件。

任何帮助将不胜感激。

opengl macos textures glteximage2d

4
推荐指数
1
解决办法
1283
查看次数

如何在opengl着色器中使用unsigned short?

我试图在着色器中上传带有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获得的深度信息进行一些操作并显示它.

c opengl glsl glteximage2d

4
推荐指数
1
解决办法
4771
查看次数

glTexImage2D与gluBuild2DMipmaps

非常基本的OpenGL纹理创建代码:

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)

opengl texturing glteximage2d mipmaps glu

3
推荐指数
1
解决办法
5049
查看次数