我正在研究一个OpenGL 2.1应用程序,并尝试将代码从固定转换为可编程管道(即不推荐使用的函数(glVertex*
,glColor*
等)调用缓冲区/着色器)。
问题是我为片段着色器内部的每个片段设置的颜色没有被设置,而是自动用最后glColor3f
调用中指定的颜色绘制片段(这是代码库中的其他位置,完全不相关一块代码在手边)。
我的vert / frag着色器非常简单:
#version 120
attribute vec3 position;
attribute vec3 color;
varying vec3 Color;
void main()
{
mat4 scaleMat = mat4(0.1,0,0,0,0,0.1,0,0,0,0,0.1,0,0,0,0,1);
Color = color;
//gl_Position = scaleMat * vec4(position,1.0); //scaling doesn't have effect!
gl_Position = vec4(position, 1.0);
}
和
#version 120
varying vec3 Color;
void main()
{
//gl_FragColor = vec4(0.3,0.3,1.0,1.0); //Const color does not work.
gl_FragColor = vec4(Color,1.0); //taking interpolated color doesn't work either!
}
还有一点,您可能会注意到我在顶点着色器中应用了缩放矩阵,使几何体缩小了10倍,但它没有任何效果!这让我想知道着色器是否甚至做了它的事情'或不。因为如果我没有正确地编写着色器,我会遇到编译错误(呃) 我使用Qt,下面是用于设置缓冲区和着色器程序的代码。
void myObject::init()
{
//Shader related code. 'shader' is QGLShaderProgram object
shader.addShaderFromSourceFile(QGLShader::Vertex,
":/shaders/mainshader.vert");
shader.addShaderFromSourceFile(QGLShader::Fragment,
":/shaders/mainshader.frag");
shader.link();
shader.bind();
vertexLocation = shader.attributeLocation("position");
colorLocation = shader.attributeLocation("color");
.......
//bathBuffer and colorBuffer are QGLBuffer objects,
//triList is a vector<vec3> containing triangle data
bathBuffer.create();
bathBuffer.bind();
bathBuffer.setUsagePattern(QGLBuffer::StaticDraw);
bathBuffer.allocate(sizeof(triList));
bathBuffer.write(0,triList.data(),sizeof(triList));
for(int i=0;i<triList.size();++i)
{
colorList.push_back(Vec(1,1,0));
}
colorBuffer.create();
colorBuffer.bind();
colorBuffer.setUsagePattern(QGLBuffer::StaticDraw);
colorBuffer.allocate(sizeof(colorList));
colorBuffer.write(0,colorList.data(),sizeof(colorList));
//copies both color and vert data
}
这里是draw()
函数:
void myObject::draw()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
shader.bind();
bathBuffer.bind();
shader.enableAttributeArray(vertexLocation);
shader.setAttributeArray(vertexLocation,GL_DOUBLE,triList.data(),3,0);
colorBuffer.bind();
shader.enableAttributeArray(colorLocation);
shader.setAttributeArray(colorLocation,GL_DOUBLE,colorList.data(),3,0);
glDrawArrays(GL_TRIANGLES, 0, triList.size());
shader.disableAttributeArray(vertexLocation);
shader.disableAttributeArray(colorLocation);
//shader.release();
}
我甚至尝试使用GL分析器来弄清楚所有抽象背后可能出现的问题:
如您所见,glCreateProgram()
返回1,但尝试glUseProgram
返回错误,说程序句柄不引用opengl生成的对象。像wtf。
然后我认为它可能是一些Qt的事情,它可能从一开始就制作一个错误的上下文,所以我也将此代码添加到我的main.cpp
,以确保我们获得正确的上下文。
QGLFormat f;
f.setOption(QGL::DeprecatedFunctions| QGL::DepthBuffer | QGL::DoubleBuffer | QGL::Rgba | QGL::AlphaChannel);
f.setVersion(2,1);
QGLContext ogl_context(f);
ogl_context.create();
ogl_context.makeCurrent();
....无济于事。
tldr;
glColor
调用以便从着色器本身绘制几何图形? 我已经没有想到的选择了。如果需要,我可以提供更多信息。任何有关这方面的帮助将不胜感激 感谢。
编辑:与此问题相关的全班:bathymetry.h,bathymetry.cpp。我添加了与这个问题相关的全班。其他代码是处理Qt部分和main.cpp的自定义窗口小部件类(不做任何opengl东西)。