如何使用clean xlib和opengl启用着色器

如何使用clean xlib和opengl启用着色器,opengl,xlib,wgl,Opengl,Xlib,Wgl,我已经有好几年没见过OpenGl了,现在我正在尝试用新的方式编写代码,但是我在绘制简单的三角形时遇到了问题。首先,我找不到任何没有使用“支持库”的好例子的教程,但这不是重点,下面的代码应该(正如我所想)绘制红色三角形,而不是白色三角形,我做错了什么 dpy = XOpenDisplay( NULL ); glxWin = generateXWindow(dpy); glEnable(GL_DEPTH_TEST); glShadeModel(GL_SMOOTH); glDepthFunc(GL_

我已经有好几年没见过OpenGl了,现在我正在尝试用新的方式编写代码,但是我在绘制简单的三角形时遇到了问题。首先,我找不到任何没有使用“支持库”的好例子的教程,但这不是重点,下面的代码应该(正如我所想)绘制红色三角形,而不是白色三角形,我做错了什么

dpy = XOpenDisplay( NULL );
glxWin = generateXWindow(dpy);

glEnable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH);
glDepthFunc(GL_LESS);

float points[] = {
     0.0f,  0.5f,  0.0f,
     0.5f, -0.5f,  0.0f,
    -0.5f, -0.5f,  0.0f
};

unsigned int vbo = 0;
glGenBuffers (1, &vbo);
glBindBuffer (GL_ARRAY_BUFFER, vbo);
glBufferData (GL_ARRAY_BUFFER, 9 * sizeof (float), points, GL_STATIC_DRAW);

unsigned int vao = 0;
glGenVertexArrays (1, &vao);
glBindVertexArray (vao);
glEnableVertexAttribArray (0);
glBindBuffer (GL_ARRAY_BUFFER, vbo);
glVertexAttribPointer (0, 3, GL_FLOAT, GL_FALSE, 0, (GLubyte*)NULL);

const char* fragmet_shader = "out vec4 frag_colour; void main() { frag_colour = vec4 (0.7, 0.0, 0.7, 1.0); }";
const char* vertex_shader  = "in vec3 vp; void main() { gl_Position = vec4 (vp, 1.0); }";

unsigned int vs = glCreateShader(GL_VERTEX_SHADER);
glShaderSource( vs, 1, &vertex_shader, NULL);
glCompileShader(vs);
unsigned int fs = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource( fs, 1, &fragmet_shader, NULL );
glCompileShader(fs);

unsigned int shader_program = glCreateProgram();
glAttachShader(shader_program, fs);
glAttachShader(shader_program, vs);
glLinkProgram(shader_program);

glVertexPointer(3, GL_FLOAT, 0, NULL);
glEnableClientState(GL_VERTEX_ARRAY);

glClearColor( 0.2, 0.2, 0.2, 1.0 );
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUseProgram (shader_program);
glBindVertexArray (vao);
glDrawArrays (GL_TRIANGLES, 0, 3);

glFlush();
glXSwapBuffers( dpy, glxWin );

我想到的一件事是:您在
in
out
中使用了更现代的着色器语法,但没有声明任何着色器版本,因此它将返回默认的1.10版本,该版本不支持该语法。使用诸如
#version 130
之类的预处理器指令作为着色器源的第一行(不要忘记此处的换行符,这对于预处理器指令很重要)


还应检查GL错误,尤其是着色器/程序的编译和链接状态,并查询信息日志

我在此仅向您介绍我的示例程序,该程序将所有“高级”功能集中于一个:FBConfig而不是visual、shaders和glXCreateContextAttrib,以获得OpenGL-3上下文(如果不可用,则返回传统OpenGL)


generateXWindow()的实现在哪里?