C++ OpenGL 着色器不起作用
C++ OpenGL Shaders not working
我刚刚开始学习 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_Position
和out vec4 gl_FragColor
一样简单。
相关文章:
- OpenGL 3.0+:正交矩阵不起作用
- OpenGL中使用Freetype进行字体渲染的问题不起作用
- 纹理不起作用 - OpenGL
- Opengl 4 调试输出不起作用
- 在某些情况下,多个 OpenGL 纹理不起作用?
- 检查刻度中的坐标不起作用(OpenGL)
- QT在CentOS 7的openGL不起作用
- OpenGL照明不起作用
- OpenGL 纹理坐标不起作用
- OpenGL 第一个多维数据集渲染不起作用
- Opengl 旋转不起作用
- OpenGL代码在GLFW上工作,但在QT OpenGL上不起作用
- OpenGL 深度测试不起作用
- 纹理绑定不起作用 / C++ / OpenGL
- 在OpenGL中绘制VBO不起作用
- OpenGL 移动对象不起作用
- C++ OpenGL 着色器不起作用
- 为什么我的 OpenGL 纹理不起作用?
- 使用默认构造函数调用的网格类不起作用 OpenGL C++
- 深度缓冲区似乎不起作用-OpenGL着色器