在我的应用程序中,我无法明确设置我绘制的线条的颜色,因为它们将是黑色,或者它们模仿我在场景中渲染的最后一个对象的颜色。
这是一个很大的问题,因为我想在我的场景中心放置一个网格。
我这样渲染:
{
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);
}
答案 0 :(得分:0)
解决方案是实际开始学习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*/