该代码在兼容性配置文件上下文版本4.3中可以正常工作,但是当我切换到核心时,即使我使用的所有GL函数都包含在核心配置文件中,也没有画出任何东西。这是代码的主要部分
glClearColor(0.f, 0.f, 0.f, 0.f);
glClearDepth(-1.d);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_GREATER);
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
glFrontFace(GL_CCW);
vs= glCreateShader(GL_VERTEX_SHADER);
fs= glCreateShader(GL_FRAGMENT_SHADER);
program= glCreateProgram();
const char* vertex_shader_text=
"#version 430 core\n"
"in vec2 vPos;"
"in vec3 vCol;"
"out vec3 colour;"
"void main() {"
"colour = vCol;"
"gl_Position = vec4(vPos, 1.0, 1.0);"
"}";
const char* fragment_shader_text=
"#version 430 core\n"
"in vec3 colour;"
"out vec4 frag_colour;"
"out vec4 frag_colour2;"
"void main() {"
"frag_colour = vec4(1.0, 1.0, 1.0, 0.0);"
"frag_colour2 = vec4(colour, 0.0);"
"}";
glShaderSource(vs, 1, &vertex_shader_text, NULL);
glShaderSource(fs, 1, &fragment_shader_text, NULL);
glCompileShader(vs);
glCompileShader(fs);
glAttachShader(program, vs);
glAttachShader(program, fs);
glBindAttribLocation(program,0,"vPos");
glBindAttribLocation(program,1,"vCol");
glBindFragDataLocation(program,0,"frag_colour2");
glLinkProgram(program);
glUseProgram(program);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
float vertices[] =
{
-1.f, 1.f, 1.f, 0.f, 0.f,
3.f-2.f*(float)sqrt(3.d), -1.f, 0.f, 1.f, 0.f,
1.f, 2.f*(float)sqrt(3.d)-3.f, 0.f, 0.f, 1.f
};
GLuint vertex_buffer = 0;
glGenBuffers(1, &vertex_buffer);
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 5, (void*) 0);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 5, (void*) (sizeof(float) * 2));
A:
if (GetMessage(&msg, NULL, 0, 0) )
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else return TRUE;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDrawArrays(GL_TRIANGLES,0,3);
SwapBuffers(ghDC2);
goto A;
最佳答案
在设置顶点属性之前,请确保创建并绑定vertex array object (VAO):
顶点数组对象(VAO)是OpenGL对象,它存储提供顶点数据所需的所有状态(下面有一个小例外)。它存储顶点数据的格式以及提供顶点数据数组的缓冲区对象(请参见下文)。请注意,VAO不会复制,冻结或存储引用缓冲区的内容-如果您更改现有VAO引用的缓冲区中的任何数据,那么VAO的用户将看到这些更改。
VAO在Core上下文中是必需的,但在Compatibility中是可选的。
关于c - 为什么核心配置文件不起作用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44786351/