C++ GLSL中的textureProj提供nan和inf

C++ GLSL中的textureProj提供nan和inf,c++,opengl,glsl,texture-mapping,uv-mapping,C++,Opengl,Glsl,Texture Mapping,Uv Mapping,以下场景: 我正在创建OpenGL纹理、帧缓冲区和相关对象 GLuint frameBuffer = 0, colorBuffer, depthBuffer; glGenFramebuffers(1, &frameBuffer); int maskRenderingWidth = 1 * settings.width, maskRenderingHeight = 1 * settings.height; //define texture glUseProgram(screenMa

以下场景:

我正在创建OpenGL纹理、帧缓冲区和相关对象

GLuint frameBuffer = 0, colorBuffer, depthBuffer;

glGenFramebuffers(1, &frameBuffer);

int maskRenderingWidth = 1 * settings.width, maskRenderingHeight = 1 * settings.height;

//define texture 
glUseProgram(screenMaskRenderingProgramId);
GLuint texture;
glGenTextures(1, &texture);

glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, maskRenderingWidth, maskRenderingHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

glPixelStorei(GL_PACK_ALIGNMENT, 1);


glUseProgram(offscreeenMaskRenderingProgramId);

//setup framebuffer stuff
glGenRenderbuffers(1, &colorBuffer);
glGenRenderbuffers(1, &depthBuffer);

glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, depthBuffer);

glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, maskRenderingWidth, maskRenderingHeight);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthBuffer);

glBindRenderbuffer(GL_RENDERBUFFER, colorBuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA, maskRenderingWidth, maskRenderingHeight);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorBuffer);

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);

GLenum DrawBuffers[1] = {GL_COLOR_ATTACHMENT0};
glDrawBuffers(1, DrawBuffers);
然后将多边形渲染到帧缓冲区,并将其放入纹理中。之后,我画了另一个多边形,但这次是到屏幕缓冲区。最后,我在整个屏幕上跨越一个四边形,并将uv坐标(0,0)、(0,1)、(1,1)和(1,0)以及之前创建的纹理传递给它

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture);
glUniform1i(textureLocation,0);
我想要实现的是,如果该纹理在某些纹理坐标上具有某些值,我希望绘制相应的纹理值,否则我希望坐标(u,v)上的输出为 原封不动

if(textureProj(mask, uv_coords).a == 1) {
    gl_FragColor = textureProj(mask, uv_coords);
}
经过一番尝试,我发现所有的东西都是从纹理开始绘制的。似乎我的纹理在某种程度上被破坏了,因为isinf和isnan为每个uv坐标的textureProj(遮罩,uv坐标)返回真值。这怎么可能,有人知道这里可能有什么东西坏了

in vec4 uv_coords;
uniform sampler2D mask;
void main() {
    vec4 c = textureProj(mask, uv_coords);
    bvec4 inf = isinf(c);
    if(inf.r == true && inf.g == true && inf.b == true && inf.a == true) {
        gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
    }
});
这将产生一个完全白色的屏幕。同样适用于

inf = isnan(c)
有人知道这是怎么回事吗

编辑:

我忘了提到,如果我在片段着色器中省略if子句,只需

in vec4 uv_coords;
uniform sampler2D mask;
void main() {
    vec4 c = textureProj(mask, uv_coords);
    gl_FragColor = c;   });
纹理绘制正确。这就更奇怪了

编辑2:


好的,我知道没有设置gl_FragColor会给出未定义的行为。因此,我的方法是将这两个纹理上传到特定的片段着色器中,并一次性渲染所有内容,可能是你的
uv_坐标。w
为0,导致
textureProj
中被零除,从而导致NaN/inf。你甚至需要
textureProj
做什么?SurvivalMachine:nope,gl\u FragColor=vec4(uv_coords.w,0.0,0.0,1.0);给我一个红色屏幕,而isnan(uv_coords.w)总是正确的Derhas:我应该用什么来代替?