根据片段位置,在片段着色器中排列没有纹理坐标的颜色

时间:2014-04-21 20:28:26

标签: c++ opengl-es opengl-es-2.0 glsl fragment-shader

我需要在OpenGL ES 2.0中绘制一个矩形,但是要在片段着色器中为矩形排列颜色。我将绘制两个三角形来表示矩形。这与纹理贴图类似,但没有纹理坐标。理想的是采用特定像素并计算其位置。另一方面,有一个数组包含 0 1 s的 16 元素。计算像素并将其与同一位置的数组元素进行比较(如果您使用 16 进行除法的剩余部分,这是可能的,因为它将返回 0 - 15 )。如果相应数组索引中的元素为 1 ,则该像素将使用片段着色器属性中的特定颜色进行着色,否则将不会着色。

下图说明了问题:

Picture as a model for the problem

这是我的问题

数组作为统一值传递给片段着色器,似乎它没有正确传递:

以下是将均匀值传递给片段着色器的代码:

void GeometryEngine::drawLineGeometry(QGLShaderProgram *program)
{

    glBindBuffer(GL_ARRAY_BUFFER, vboId);

    // Bind attribute position in vertex shader to the program
    int vertexLocation = program->attributeLocation("position");
    program->enableAttributeArray(vertexLocation);
    glVertexAttribPointer(vertexLocation, 3, GL_FLOAT, GL_FALSE, 0, 0);

    const int array[16] = {1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0};


    int arrayLocation = program->attributeLocation("array");
    program->setUniformValueArray(arrayLocation, array, 16);
    // Draw triangles (6 points)
    glDrawArrays(GL_TRIANGLES, 0, 6);
}

片段着色器:

uniform int array[16];

void main()
{

     gl_FragColor = vec4(array[0], 0.0, 0.0, 1.0);

   /* int index = int(mod(gl_FragCoord.x, 16.0));
    if( array[index] == 1 )
        gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
    else
        gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);
   */
}

注释行应为片段创建特定颜色,但我无法测试此部分,因为数组未正确传递。矩形是黑色,而不是红色(数组[0]是1,而不是0)。

0 个答案:

没有答案