我刚刚开始学习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;
}
...但没有打印
答案 0 :(得分:1)
gl_Position
是一个预先定义的内置变量,你的GLSL编译器肯定会抱怨尝试重新定义它和错误。同样,gl_FragColor
位于保留名称空间中。
当然,您的代码缺少着色器信息日志的查询,因此您没有看到编译器输出;您的附录只是查询程序链接器日志。
解决方案可能就像从着色器源中省略out vec4 gl_Position
和out vec4 gl_FragColor
一样简单。