OpenGL(2.1)着色器程序没有运行,使用glColor的颜色而不是

时间:2016-11-17 08:02:57

标签: c++ opengl qt4

我正在研究一个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分析器来弄清楚所有抽象背后可能出现的问题:
is the profiler stupid or am I

如您所见,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;

  • 我不确定着色器是否正常工作
  • 有没有办法忽略/&#39;关闭&#39; glColor调用以便从着色器本身绘制几何图形?

我已经没有想到的选择了。如果需要,我可以提供更多信息。任何有关这方面的帮助将不胜感激 感谢。

编辑:与此问题相关的全班:bathymetry.hbathymetry.cpp。我添加了与这个问题相关的全班。其他代码是处理Qt部分和main.cpp的自定义窗口小部件类(不做任何opengl东西)。

0 个答案:

没有答案