Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenGL纹理损坏_Opengl - Fatal编程技术网

OpenGL纹理损坏

OpenGL纹理损坏,opengl,Opengl,我正在OpenGL中渲染简单的像素缓冲区。首先,我创建一个四边形,然后创建一个纹理。如果缓冲区中没有更改,它将正常工作。当我通过glTexSubImage2D或glTexImage2D更改缓冲区并将新缓冲区添加到纹理中时,纹理的顶部会像图像一样损坏 我这样创建缓冲区 int length = console->width * console->height * 3; GLubyte buf[length]; for(int i = 0; i < length; i += 3

我正在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);
我像这样更新纹理

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);
为了进行测试,我在render函数中这样更改了缓冲区

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,这次再次运行,我得到了相同的结果,但在图片左下角你们可以看到第三个像素是深蓝色的。当我打印
printf时(“第三个像素:%d-%d-%d\n”,控制台->缓冲区[12],控制台->缓冲区[13],控制台->缓冲区[14])。值我得到红色:0绿色:0蓝色:0值。这意味着我的缓冲区正常


我找到了解决办法。正如普莱卢隆在对问题的评论中所说的那样。我在中将
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;
}
console->buffer=malloc(sizeof(GLubyte)*长度);
对于(int i=0;i缓冲区[i]=0;
控制台->缓冲区[i+1]=0;
控制台->缓冲区[i+2]=0;
}

没有足够的代码来查看故障所在。第二次更新时,您的
控制台->缓冲区的格式似乎不正确。第一个不同的方法?我只是更新,比如
console->buffer[6]=255//6在我的渲染函数中是红色的,用于测试。为什么缓冲区使用
int
,纹理使用
GL\u UNSIGNED\u BYTE
?我在创建缓冲区时使用
GLubyte
,在创建纹理时使用
GL\u UNSIGNED\u BYTE
。如果
buf
超出范围,则整个数据都是垃圾,请小心。你如何渲染它?