I started to learn GLSL yesterday and followed the first example in OpenGL 4.0 Shading Language Cookbook to draw a triangle step by step.
Here are my codes:
1.shader.vert
#version 400 in vec3 VertexPosition; in vec3 VertexColor; out vec3 Color; void main() { Color = VertexColor; gl_Position = vec4(VertexPosition, 1.0); } 2.shader.frag
#version 400 in vec3 Color; out vec4 FragColor; void main(){ FragColor = vec4(Color, 1.0); } 3.main.cpp
int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); glutInitWindowSize(500, 500); glutCreateWindow("Project1"); glutDisplayFunc(render); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0, 100, 0, 100); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glEnable(GL_POINT_SMOOTH); // init glew GLenum err = glewInit(); if (GLEW_OK != err){ printf("Error: %s\n", glewGetErrorString(err)); } else{ printf("OK: glew init.\n"); } // check gl version const GLubyte *renderer = glGetString(GL_RENDERER); const GLubyte *vendor = glGetString(GL_VENDOR); const GLubyte *version = glGetString(GL_VERSION); const GLubyte *glslVersion = glGetString(GL_SHADING_LANGUAGE_VERSION); GLint major, minor; glGetIntegerv(GL_MAJOR_VERSION, &major); glGetIntegerv(GL_MINOR_VERSION, &minor); printf("GL Vendor : %s\n", vendor); printf("GL Renderer : %s\n", renderer); printf("GL Version (string) : %s\n", version); printf("GL Version (integer): %d.%d\n", major, minor); printf("GLSL Version: %s\n", glslVersion); // vertex shader GLuint vertShader = createAndCompileShader("shader.vert", VERTEX); // fragment shader GLuint fragShader = createAndCompileShader("shader.frag", FRAGMENT); // program GLuint programHandle = glCreateProgram(); if (programHandle == 0) { printf("Error creating program object.\n"); } glAttachShader(programHandle, vertShader); glAttachShader(programHandle, fragShader); glLinkProgram(programHandle); GLint status; glGetProgramiv(programHandle, GL_LINK_STATUS, &status); if (GL_FALSE == status){ printf("Failed to link shader program"); } else{ printf("OK\n"); glUseProgram(programHandle); } glutMainLoop(); return EXIT_SUCCESS; } I create and compile the shader in createAndCompileShader and the status of the compilation is success.
And I draw a triangle in render function.
void render() { glLoadIdentity(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); glBegin(GL_TRIANGLES); glColor3f(1.0, 0.0, 0.0); glVertex2f(20, 20); glColor3f(0.0, 1.0, 0.0); glVertex2f(80, 20); glColor3f(0.0, 0.0, 1.0); glVertex2f(50, 80); glEnd(); glPopMatrix(); glutSwapBuffers(); } The status of link is also success. However, there's nothing drawn in the window. I'm sure the function render is right.
Is there something wrong?
gl_Position = ftransform();inside your vertex shader to incorporate the transform matrices... (sorry I code in core profile so did not strike mi it at first you are missing that line)