opengl学习笔记(二)

这段时间终于接触到一点点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() ;

}


 

 

你可能感兴趣的:(OpenGL)