绘图时无法设置线条颜色
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*/
在我的应用程序中,我无法明确设置我绘制的线条的颜色,因为它们要么是黑色,要么模仿我在场景中渲染的最后一个对象的颜色。
这是一个相当大的问题,因为我想在场景的中心放置一个网格。
我这样渲染:
{
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*/