C ++ OpenGL着色器无法正常工作

时间:2016-06-02 04:33:04

标签: c++ opengl shader

我刚刚开始学习c ++,我正在尝试用带有颜色的三角形的着色器创建一个程序。

这是我的顶点着色器:

const GLchar* vertexSource =
"#version 150 core\n"
"in vec4 position;"
"in vec4 color;"
"out vec4 Color;"
"out vec4 gl_Position;"
"void main(){"
"   gl_Position = position;"
"   Color = color;"
"}";

这是我的片段着色器:

const GLchar* fragmentSource =
"#version 150 core\n"
"in vec4 Color;"
"out vec4 gl_FragColor"
"void main(){"
"    gl_FragColor = Color;"
"}";

我分别列出了co-ords和颜色的值列表:

float vertices[]{
    -1.0f, -1.0f, 0.0f,1.0f,   1.0f,0.0f,0.0f,1.0f,
    1.0f, -1.0f, 0.0f,1.0f,    0.0f,1.0f,0.0f,1.0f,
    0.0f,  1.0f, 0.0f,1.0f,    0.0f,0.0f,1.0f,1.0f,
};

我初始化'顶点缓冲对象'和'顶点数组对象'

GLuint vao; //Initialise vertex array object
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);

GLuint vbo; //Initialise vertex buffer object
glGenBuffers(1,&vbo);
glBindBuffer(GL_ARRAY_BUFFER,vbo);
glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_STATIC_DRAW);

我编译着色器程序:

GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, &vertexSource, NULL);
glCompileShader(vertexShader);

GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &fragmentSource, NULL);
glCompileShader(fragmentShader);

GLuint shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);

glUseProgram(shaderProgram);

我为着色器定义了一些属性:

glBindAttribLocation(shaderProgram, 0, "position");
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 8 * sizeof(float), 0);
glEnableVertexAttribArray(0);

glBindAttribLocation(shaderProgram, 1 ,"color");
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(4 * sizeof(float)));
glEnableVertexAttribArray(1);

最后我在'do,while'循环中绘制三角形

glDrawArrays(GL_TRIANGLES, 0, 3);

但是,它不会打印任何三角形,而是显示黑屏。

我从在线教程中获得了大部分代码,并且我正在尝试重写所有内容以了解一切是如何工作的。

有谁能看到我哪里出错了?任何建议将不胜感激:)

编辑:

我添加了一些代码来检查错误:

if (status == GL_FALSE)
{
    GLint infoLogLength;
    glGetShaderiv(shaderProgram, GL_INFO_LOG_LENGTH, &infoLogLength);

    GLchar* strInfoLog = new GLchar[infoLogLength + 1];
    glGetProgramInfoLog(shaderProgram, infoLogLength, NULL, strInfoLog);

    std::cout << strInfoLog;
    delete[] strInfoLog;
}

...但没有打印

1 个答案:

答案 0 :(得分:1)

gl_Position是一个预先定义的内置变量,你的GLSL编译器肯定会抱怨尝试重新定义它和错误。同样,gl_FragColor位于保留名称空间中。

当然,您的代码缺少着色器信息日志的查询,因此您没有看到编译器输出;您的附录只是查询程序链接器日志。

解决方案可能就像从着色器源中省略out vec4 gl_Positionout vec4 gl_FragColor一样简单。