GLSL 第一个代码

来源:互联网 发布:游戏王巅峰知乎 编辑:程序博客网 时间:2024/05/17 20:30

参考自http://hi.baidu.com/aawweeffaa/blog/item/313c0c2e568301301f3089bc.html

 

 

第一步:在glsl.cpp的同级目录里,新建二个文本文件

第一个取名first.vert,在里面编写顶点着色器,代码如下:

 

void main()

{

     gl_Position     = ftransform();

}

第二个取名first.frag,在里面编写片元着色器,代码如下:

 

void main()

{

    gl_FragColor = vec4(1.0, 1.0, 0.0, 1.0);

}

 

 

 

以上两个是最简单的着色器代码,把片元设成黄色

第二步:将下面这段程序添加到上次新建好的glsl.cpp

 

 

 

//#include "stdafx.h"

 

//包含GLSL所需的头文件

 

#include <iostream>

#include <gl/glut.h>

#include <gl/glext.h>

 

 

 

 

 

static GLuint vertShader;   //顶点着色器对象

static GLuint fragShader;   //片元着色器对象

static GLuint glslProgram;   //程序对象

 

PFNGLATTACHSHADERPROC glAttachShader;

PFNGLSHADERSOURCEPROC glShaderSource;

PFNGLCOMPILESHADERPROC glCompileShader;

PFNGLCREATEPROGRAMPROC glCreateProgram;

PFNGLCREATESHADERPROC glCreateShader;

PFNGLLINKPROGRAMPROC glLinkProgram;

PFNGLUSEPROGRAMPROC glUseProgram;

PFNGLGETSHADERIVPROC glGetShaderiv;

PFNGLGETSHADERINFOLOGPROC glGetShaderInfoLog;

PFNGLGETPROGRAMIVPROC glGetProgramiv;

PFNGLGETPROGRAMINFOLOGPROC glGetProgramInfoLog;

 

//读入着色器代码

int readShaderSource(GLuint shader, const char *file)

{

FILE *fp;

const GLchar *source;

GLsizei length;

int ret;

 

glShaderSource = (PFNGLSHADERSOURCEPROC)wglGetProcAddress("glShaderSource");

 

fp = fopen(file, "rb");

if (fp == NULL) {

perror(file);

return -1;

}

 

fseek(fp, 0L, SEEK_END);

length = ftell(fp);

 

source = (GLchar *)malloc(length);

if (source == NULL) {

fprintf(stderr, "Could not allocate read buffer./n");

return -1;

}

 

fseek(fp, 0L, SEEK_SET);

ret = fread((void *)source, 1, length, fp) != (size_t)length;

fclose(fp);

 

if (ret)

fprintf(stderr, "Could not read file: %s./n", file);

else

glShaderSource(shader, 1, &source, &length);

 

free((void *)source);

 

return ret;

}

 

//输出着色器LOG

void printShaderInfoLog(GLuint shader)

{

GLsizei bufSize;

GLchar *infoLog;

GLsizei length;

 

glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC)wglGetProcAddress("glGetShaderInfoLog");

 

glGetShaderiv(shader, GL_INFO_LOG_LENGTH , &bufSize);

if (bufSize > 0) {

infoLog = (GLchar *)malloc(bufSize);

if (infoLog != NULL) {

glGetShaderInfoLog(shader, bufSize, &length, infoLog);

printf("%s/n", infoLog);

free(infoLog);

}

else

printf("Could not allocate InfoLog buffer./n");

}

}

 

//输出程序LOG

void printProgramInfoLog(GLuint program)

{

GLsizei bufSize;

GLchar *infoLog;

GLsizei length;

 

glGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC)wglGetProcAddress("glGetProgramInfoLog");

 

glGetProgramiv(program, GL_INFO_LOG_LENGTH , &bufSize);

if (bufSize > 0) {  

infoLog = (GLchar *)malloc(bufSize);

if (infoLog != NULL) {   

glGetProgramInfoLog(program, bufSize, &length, infoLog);

printf("%s/n", infoLog);

free(infoLog);

}

else

printf("Could not allocate InfoLog buffer./n");

}

}

 

//初始化

 

void init(void)

{

glClearColor(0.0,0.0,0.0,0.0);

 

glAttachShader = (PFNGLATTACHSHADERPROC)wglGetProcAddress("glAttachShader");

glCompileShader = (PFNGLCOMPILESHADERPROC)wglGetProcAddress("glCompileShader");

glCreateProgram = (PFNGLCREATEPROGRAMPROC)wglGetProcAddress("glCreateProgram");

glCreateShader = (PFNGLCREATESHADERPROC)wglGetProcAddress("glCreateShader");

glLinkProgram = (PFNGLLINKPROGRAMPROC)wglGetProcAddress("glLinkProgram");

glUseProgram = (PFNGLUSEPROGRAMPROC)wglGetProcAddress("glUseProgram");

glGetShaderiv = (PFNGLGETPROGRAMIVPROC)wglGetProcAddress("glGetShaderiv");

glGetProgramiv = (PFNGLGETPROGRAMIVPROC)wglGetProcAddress("glGetProgramiv");

 

GLint compiled, linked;

 

//创建顶点着色器对象和片元着色器对象

vertShader = glCreateShader(GL_VERTEX_SHADER);

fragShader = glCreateShader(GL_FRAGMENT_SHADER);

 

//读入着色器代码

readShaderSource(vertShader, "first.vert");

readShaderSource(fragShader, "first.frag");

 

//编译顶点着色器

glCompileShader(vertShader);

glGetShaderiv(vertShader, GL_COMPILE_STATUS, &compiled);

printShaderInfoLog(vertShader);

if (compiled == GL_FALSE) {

printf("Compile error in vertex shader./n");

exit(1);

}

 

//编译片元着色器

glCompileShader(fragShader);

glGetShaderiv(fragShader, GL_COMPILE_STATUS, &compiled);

printShaderInfoLog(fragShader);

if (compiled == GL_FALSE) {

printf("Compile error in vertex shader./n");

exit(1);

}

 

//创建一个程序对象

glslProgram = glCreateProgram();

 

//将编译好的着色器捆绑到程序对象上

glAttachShader(glslProgram, vertShader);

glAttachShader(glslProgram, fragShader);

 

//连接程序对象

glLinkProgram(glslProgram);

glGetProgramiv(glslProgram, GL_LINK_STATUS, &linked);

printProgramInfoLog(glslProgram);

if (linked == GL_FALSE) {

printf("Link error./n");

exit(1);

}

 

//使用着色器

glUseProgram(glslProgram);

}

 

//物体描画

 

void display(void)

{

glClear(GL_COLOR_BUFFER_BIT);

glRectf(-25.0, -25.0, 25.0, 25.0);

glFlush();

}

 

void reshape(int w, int h)

{

glViewport(0, 0, (GLsizei) w, (GLsizei) h);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

glOrtho(-50.0, 50.0, -50.0, 50.0, -1.0, 1.0);

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

}

 

//主函数

 

int main(int argc, char** argv)

{

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);

glutInitWindowSize(250,250);

glutInitWindowPosition(100,100);

glutCreateWindow("GLSL");

init();

glutDisplayFunc(display);

glutReshapeFunc(reshape);

glutMainLoop();

return 0;

}