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 '
" , 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() ;
}


原文地址:https://www.cnblogs.com/riasky/p/3435961.html