这段时间终于接触到一点点shader了,应该说shader是非常有用的东西吧,它就是能够把一些固定渲染管线的东西改变了,按照自己的意愿进行渲染,这样的话图形就可以自由发挥了。
我也只是试验了一下shader,然后有一些经验:
一、windows上面的gl版本只有1.1,永远只有1.1,微软太万恶了。。
1.1没有GLSL,不能写shader,,,,,,
所以要用一个开源的库,叫glew,用它才能在windows上写shader。。
蛋疼的微软。。。
二、glew使用之前要初始化,glewinit。
而且要在创建窗口之后初始化,
初始化之后才能用,才能写shader
下面是我试验了一下shader能不能用,只是试验这个东西好不好使,可以跑起来的:
#include
#include
#include
#include
#include
#include
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() ;
}