C++ OpenGL 着色器不起作用

C++ OpenGL Shaders not working

本文关键字:不起作用 OpenGL C++      更新时间:2023-10-16

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

这是我的顶点着色器:

const GLchar* vertexSource =
"#version 150 coren"
"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 coren"
"in vec4 Color;"
"out vec4 gl_FragColor"
"void main(){"
"    gl_FragColor = Color;"
"}";

我分别有一个坐标和颜色的值列表:

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);

最后,我在"做,同时"循环中绘制三角形

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;
}

。但什么都没有打印

gl_Position是一个

预定义的内置变量,您的 GLSL 编译器肯定会抱怨试图重新定义它并出错。同样,gl_FragColor位于保留命名空间中。

当然,您的

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

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