我在OpenGL中渲染简单的像素缓冲区。首先,我创建一个四边形,然后我创建一个纹理。如果缓冲区没有变化,它可以正常工作。当我更改缓冲区并通过glTexSubImage2D
或glTexImage2D
将新缓冲区添加到纹理中时,我的纹理顶部会像图像一样腐败。
我像这样创建我的缓冲区。
int length = console->width * console->height * 3;
GLubyte buf[length];
for(int i = 0; i < length; i += 3) {
buf[i] = 0;
buf[i + 1] = 0;
buf[i + 2] = 0;
}
console->buffer = buf;
我创建这样的纹理。
glGenTextures(1, &console->textureID);
glBindTexture(GL_TEXTURE_2D, console->textureID);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, console->width, console->height, 0, GL_RGB, GL_UNSIGNED_BYTE, console->buffer);
tpUseShader(console); // -> calls glUseShader(console->programID);
glUniform1i(glGetUniformLocation(console->programID, "texture"), 0);
我像这样更新纹理。
glBindTexture(GL_TEXTURE_2D, console->textureID);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, console->width, console->height, GL_RGB, GL_UNSIGNED_BYTE, console->buffer);
为了测试我在渲染功能中更改我的缓冲区
if(console->buffer[6] == 255) {
console->buffer[6] = 0; // 6 is second pixel's red value.
console->buffer[10] = 255; // 10 is third pixel's green value
} else {
console->buffer[6] = 255;
console->buffer[10] = 0;
}
然后我调用tpUseShader并渲染我的四边形。
我该如何解决这个问题?
我将我的控制台大小更改为10x10并且这次再次运行我得到了相同的结果但是,在图像中你可以从左下角看到第3个像素是深蓝色。当我打印printf("3rd pixel: %d- %d - %d\n", console->buffer[12], console->buffer[13], console->buffer[14]);
时。值得红了:0绿色:0蓝色:0值。这意味着我的缓冲区正常。
答案 0 :(得分:0)
我得到了解决方案。 pleluron在评论的评论中说。我将buf
更改为console->buffer
,然后就可以了!现在我的缓冲区初始化代码是这样的:
console->buffer = malloc(sizeof(GLubyte) * length);
for(int i = 0; i < length; i += 3) {
console->buffer[i] = 0;
console->buffer[i + 1] = 0;
console->buffer[i + 2] = 0;
}