绘图时无法设置线条颜色

Can't set line color while drawing

在我的应用程序中,我无法明确设置我绘制的线条的颜色,因为它们要么是黑色,要么模仿我在场景中渲染的最后一个对象的颜色。

这是一个相当大的问题,因为我想在场景的中心放置一个网格。

我这样渲染:

{
    shaderProgram.bind();
    shaderProgram.setUniformValue("mvpMatrix", qmat);
    shaderProgram.setUniformValue("texture", 0);

    for (int x = 0; x < tileCount; x++)
    {
        shaderProgram.setAttributeArray("vertex", tiles[x]->vertices.constData());
        shaderProgram.enableAttributeArray("vertex");
        shaderProgram.setAttributeArray("textureCoordinate", textureCoordinates.constData());
        shaderProgram.enableAttributeArray("textureCoordinate");
        glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, tiles[x]->image.width(), tiles[x]->image.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, tiles[x]->image.bits());
        glDrawArrays(GL_TRIANGLES, 0, tiles[x]->vertices.size());
    }

    //Draw Lines
    for (int x = -2000; x < 2000; x+=10)
    {
        glLineWidth(1);
        glColor3f(1,0,0);
        glBegin(GL_LINE_LOOP);
        glVertex3f(x,0,2000);
        glVertex3f(x,0,-2000);
        glEnd();
    }

    shaderProgram.release();
}

我需要对片段着色器做些什么吗?我目前自己绘制顶点,所以我不知道如何设置它以合并颜色和纹理 我的片段着色器是这样设置的:

uniform sampler2D texture;

in vec2 varyingTextureCoordinate;

out vec4 fragColor;

void main(void)
{
    fragColor = texture2D(texture, varyingTextureCoordinate);
}

解决方案是真正开始学习 GLSL 并编写我自己的着色器,而不是依赖我在第一个 OpenGL 教程中提供的着色器。

正如其他人所说,我需要改变我的片段着色器输出碎片颜色的方式,比如将它乘以不同的颜色向量:

fragColor = color * texture2D(texture, varyingTextureCoordinate);

但是,仅此代码是有问题的,因为颜色必须是 Vec4,并且我的纹理没有统一的 alpha 通道,而且我的线条没有替换纹理。 简单的解决方案是也向片段着色器发送一个布尔值,以检查我是只想渲染纹理还是渲染颜色:

uniform sampler2D texture;
uniform bool colors;
void main(void)
{
    vec4 textureColor = texture2D(texture, varyingTextureCoordinate);   
    if (colors == true)
        fragColor = color;
    else
        fragColor = textureColor;
}

在我的绘画功能中:

//Before Painting objects
shaderProgram.setUniformValue("colors", false);
shaderProgram.enableAttributeArray("colors");
/*Draw Objects*/

shaderProgram.setUniformValue("colors", true);
shaderProgram.enableAttributeArray("colors");
/*Draw Lines*/