相关疑难解决方法(0)

你能用一个VBO多个目标吗?

示例代码:

1. glGenBuffers(1, &VboId);
2. glBindBuffer(GL_ARRAY_BUFFER, VboId);
3. glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);
4. glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
Run Code Online (Sandbox Code Playgroud)

所以我们生成一个通用的VBO句柄,然后使用"GL_ARRAY_BUFFER"绑定它.绑定似乎有两个目的:

  1. 在我们将数据复制到GPU之前,我们必须绑定缓冲区 glBufferData
  2. 我们必须先绑定缓冲区才能通过它添加属性 glVertexAttribPointer

而且我认为这是你需要绑定VBO的唯一两次.我的问题是,是否存在第2和第3行的目标(GL_ARRAY_BUFFER,GL_ELEMENT_ARRAY_BUFFER,GL_PIXEL_PACK_BUFFER或GL_PIXEL_UNPACK_BUFFER)不同的情况?或者我们想要在第4行之前将其重新绑定到不同的目标?

我们可以将多个缓冲区目标绑定到单个VBO吗?

opengl vbo buffer-objects

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

OpenGL纹理管理

我正在推出我的第一个游戏引擎:D.我现在正在处理纹理资源管理器,我想做得对.

以任何方式填充驱动程序支持的所有ActiveTexture单元是不是很糟糕?另一种方法是保存这些插槽,只在实际需要时设置纹理,代价是更多的glBindTexture调用.

opengl textures game-engine

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

在执行glTexImage2D和glTexSubImage2D之前,是否需要调用glGenTextures和glBindTexture

嗨我有35张图像可以在显示屏上绘制.我在7X5网格中绘制它.图像从互联网下载.每次下载图像时,我都会尝试绘制整个35张图像.但其中一些还没有下载.所以我为他们画了一些默认的瓷砖.问题是每次下载图像我也会再次绘制先前绘制的图像.我想减少它.所以我在想做像Texture Atlas这样的事情.我想手动完成它.我是通过制作一个大图像glTexImage2D并添加子图像来实现的glTexSubImage2D.

glGenTextures(1, tex);
glBindTexture(GL_TEXTURE_2D, (*tex));
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0, textureImageInfo->format, textureImageInfo->texWidth, textureImageInfo->texHeight, 0, textureImageInfo->format, GL_UNSIGNED_BYTE, NULL);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, textureImageInfo->imageWidth, textureImageInfo->imageHeight, textureImageInfo->format, GL_UNSIGNED_BYTE, textureImageInfo->image);
Run Code Online (Sandbox Code Playgroud)

我打电话给35 glTexSubImage2D,将所有35张图片添加到一张大图片中glTexImage2D.在这里,我只写了一个以便于解释.然后我终于做到了

glEnable(GL_TEXTURE_2D);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);

glVertexPointer(3, GL_FLOAT, 0, this->tileCoordList); 
glTexCoordPointer(3, GL_FLOAT, 0, this->tileTextureCoordList);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisable(GL_TEXTURE_2D);
Run Code Online (Sandbox Code Playgroud)

现在我感到困惑的是,我是否需要生成和绑定纹理35次以进行35次调用glTexSubImage2D?或者只做一次就足够了.我不明白的实际问题是什么绑定纹理必须做任何事情.谢谢.

c++ opengl textures glteximage2d

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

标签 统计

opengl ×3

textures ×2

buffer-objects ×1

c++ ×1

game-engine ×1

glteximage2d ×1

vbo ×1