这段时间终于接触到一点点shader了,应该说shader是非常有用的东西吧,它就是能够把一些固定渲染管线的东西改变了,按照自己的意愿进行渲染,这样的话图形就可以自由发挥了。
我也只是试验了一下shader,然后有一些经验:
一、windows上面的gl版本只有1.1,永远只有1.1,微软太万恶了。。
1.1没有GLSL,不能写shader,,,,,,
所以要用一个开源的库,叫glew,用它才能在windows上写shader。。
蛋疼的微软。。。
二、glew使用之前要初始化,glewinit。
而且要在创建窗口之后初始化,
初始化之后才能用,才能写shader
下面是我试验了一下shader能不能用,只是试验这个东西好不好使,可以跑起来的:
#include <windows.h> #include <GL/glew.h> #include <GL/glut.h> #include <iostream> #include <string> #include <cstdio> using namespace std ; void init() ; void display() ; void reshape( int , int ) ; void makeShader() ; int main( int argc , char ** argv ) { //glewInit() ; glutInit( &argc , argv ) ; glutInitWindowSize( 500 , 500 ) ; glutInitDisplayMode( GLUT_RGB | GLUT_SINGLE ) ; glutCreateWindow( "cube" ) ; glewInit() ; makeShader() ; init() ; glutDisplayFunc( display ) ; glutReshapeFunc( reshape ) ; glutMainLoop() ; return 0 ; } void makeShader() { int shader , program , compiled , linked ; const GLchar* shaderSrc[] = { "void main()" "{" " gl_Position = gl_ModelViewProjectionMatrix *gl_Vertex ; " "}" } ; shader = glCreateShader( GL_VERTEX_SHADER ) ; glShaderSource( shader , 1 , shaderSrc , NULL ) ; glCompileShader( shader ) ; glGetShaderiv( shader , GL_COMPILE_STATUS , &compiled) ; if( !compiled ) { GLint Length ; GLchar *log ; glGetShaderiv( shader , GL_INFO_LOG_LENGTH , &Length ) ; log = (GLchar*)malloc( Length ) ; glGetShaderInfoLog( shader , Length , &Length , log ) ; fprintf( stderr , "compile log = '%s '\n" , log ) ; free( log ) ; } program = glCreateProgram() ; glAttachShader( program , shader ) ; glLinkProgram( program ) ; glGetProgramiv( program , GL_LINK_STATUS , &linked ) ; if( linked ) { glUseProgram( program ) ; } else { cout << "error" << endl ; } } void init() { //makeShader() ; glClearColor( 0 , 0 , 0 , 0 ) ; glClear( GL_COLOR_BUFFER_BIT ) ; } void reshape( int w , int h ) { glViewport( 0 , 0 , w , h ) ; glMatrixMode( GL_PROJECTION ) ; glLoadIdentity() ; glFrustum( -1 , 1 , -1 , 1 , 1 , 5 ) ; glMatrixMode( GL_MODELVIEW ) ; glLoadIdentity() ; } void display() { glColor3f( 1 , 1 , 0 ) ; gluLookAt( 0 , 0 , 5 , 0 , 0 , 0 , 0 , 1 , 0 ) ; glTranslatef( 1 , 0 , 0 ) ; glRotatef( 30 , 0 , 0 , 1 ) ; glutWireCube( 1 ) ; glRotatef( -30 , 0 , 0 , 1 ) ; glTranslatef( 1 , 0 , 0 ) ; glBegin( GL_TRIANGLES ) ; glVertex3f( 0 , 0 , 0 ) ; glVertex3f( 0 , 0.5 , 0 ) ; glVertex3f( 0.5 , 0.5 , 0 ) ; glEnd() ; glFlush() ; }