GLSL奇怪的IF行为

时间:2015-06-17 16:43:01

标签: ios opengl-es glsl

我正在使用OpenGL ES 3.0编写在iPad Retina上运行的iPad应用程序

我试图第一次使用变换反馈,而顶点着色器的表现非常奇怪。看起来IF命令中的布尔表达式总是返回true,例如这个着色器:

#version 300 es

in ivec2 coords;


out highp uint vertexID;

uniform sampler2D depthTexture;
uniform int yResolution;

void main () {

    ivec2 textCoords = coords;
    textCoords.y = yResolution - 1 - coords.y;

    bool val = true;
    bool val2 = false;
    if (val == val2) {
        vertexID = uint(6);
        return;
    }
    vertexID = uint(4);
    return;
}

当我映射VBO并检查值得到6!

我将发布下面的绘图和映射代码:

    glUseProgram(_ValidInputPixelsProg);

    uniforms[UNIFORM_VALID_INPUT_PIXEL_DEPTH_TEXTURE] = glGetUniformLocation(_ValidInputPixelsProg, "depthTexture");
    uniforms[UNIFORM_VALID_INPUT_PIXEL_Y_RESOLUTION] = glGetUniformLocation(_ValidInputPixelsProg, "yResolution");

    glUniform1i(uniforms[UNIFORM_VALID_INPUT_PIXEL_DEPTH_TEXTURE], 10);
    glUniform1i(uniforms[UNIFORM_VALID_INPUT_PIXEL_Y_RESOLUTION], RESOLUTION_Y);

    glEnable(GL_RASTERIZER_DISCARD);
    glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, inputTFB);
    glBindVertexArray(validPixelsVA);
    glBindBuffer(GL_ARRAY_BUFFER, _inputTFBBuffer);
    glBeginTransformFeedback(GL_POINTS);
    glDrawArrays(GL_POINTS, 0, RESOLUTION_INNER_XY);
    glEndTransformFeedback();
    glBindVertexArray(0);
    glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
    glDisable(GL_RASTERIZER_DISCARD);
    glFlush();

    glBindBuffer(GL_ARRAY_BUFFER, indexValidInputPixels);
    GLuint* ptr = (GLuint*)(glMapBufferRange(GL_ARRAY_BUFFER, 0, RESOLUTION_INNER_XY * sizeof(GLuint), GL_MAP_READ_BIT));
    ptr += 320 + 120;
    NSLog(@"\nshader value = %u \n", *ptr);
    glUnmapBuffer(GL_ARRAY_BUFFER);

有人知道我做错了吗?

1 个答案:

答案 0 :(得分:0)

让if语句检查非变量。

if (val == false)
{
    vertexID = uint(6);
    return;
}