OpenGL_砖块着色案例

来源:互联网 发布:数据宝股票官方网站 编辑:程序博客网 时间:2024/06/04 19:33

效果图:


顶点着色器:

uniform vec3 LightPosition;const float SpecularContribution=0.3;const float DiffuseContribution=1.0-SpecularContribution;varying float LightIntensity;varying vec2 MCposition;void main(void){   vec3 ecPosition=vec3(gl_ModelViewMatrix*gl_Vertex);   vec3 tnorm=normalize(gl_NormalMatrix*gl_Normal);   vec3 lightVec=normalize(LightPosition-ecPosition);   vec3 reflectVec=reflect(-lightVec,tnorm);   vec3 viewVec=normalize(-ecPosition);   float diffuse=max(dot(lightVec,tnorm),0.0);   float spec=0.0;   if(diffuse>0.0){   spec=max(dot(reflectVec,viewVec),0.0);   spec=pow(spec,16.0);   }   LightIntensity=DiffuseContribution*diffuse+SpecularContribution*spec;   MCposition=gl_Vertex.xy;   gl_Position = ftransform();}

片元着色器:

varying vec2 MCposition;varying float LightIntensity;void main(void){   vec3 BrickColor=vec3(0.7,0.3,0.2);   vec3 MortarColor=vec3(0.85,0.86,0.84);   vec2  BrickSize=vec2(0.1,0.05638);   vec2  BrickPct=vec2(0.9,0.85);   vec3 color;   vec2 position,useBrick;   position=MCposition/BrickSize;   if(fract(position.y*0.5)>0.5) position.x+=0.5;   position=fract(position);   useBrick=step(position,BrickPct);      color=mix(MortarColor,BrickColor,useBrick.x*useBrick.y);   color*=LightIntensity;         gl_FragColor = vec4( color, 1.0 );}

执行代码:

<pre name="code" class="cpp">#include <stdio.h>#include <stdlib.h>#include "stdafx.h"#include <math.h>#ifdef _WIN32#include <windows.h>#include <wingdi.h>#define GLUT_DISABLE_ATEXIT_HACK#endif /* _WIN32 */#include "glew.h"#ifndef M_PI#define M_PI 3.14159265358979323846#endifextern void shaderAttachFromFile(GLuint,GLenum,const char *);//加载shader方法,请参考我的博客,有相关介绍static GLuint g_program;static GLuint g_programCameraPositionLocation;static GLuint g_programLightPositionLocation;static GLuint g_programLightColorLocation;static GLuint g_cylinderBufferId;static unsigned int g_cylinderNumVertices;static float g_cameraPosition[3];#define NUM_LIGHTS 1static float g_lightPosition[NUM_LIGHTS*3];
//创建圆柱static void createCylinder(unsigned int divisions){const int floatsPerVertex=6;unsigned int i,size;float *v;g_cylinderNumVertices=(divisions+1)*2;size=floatsPerVertex*g_cylinderNumVertices;v=(float *)malloc(sizeof(float)*size);for(i=0;i<=divisions;i++){float r=((M_PI*2.0f)/(float)divisions)*(float)i;unsigned int index1=i*2*floatsPerVertex;unsigned int index2=index1+floatsPerVertex;/* vertex positions */v[index1 + 0] = cosf(r);v[index1 + 1] = 1.0f;v[index1 + 2] = -sinf(r);v[index2 + 0] = cosf(r);v[index2 + 1] = -1.0f;v[index2 + 2] = -sinf(r);/* normals */v[index1 + 3] = cosf(r);v[index1 + 4] = 0.0f;v[index1 + 5] = -sinf(r);v[index2 + 3] = v[index1 + 3];v[index2 + 4] = v[index1 + 4];v[index2 + 5] = v[index1 + 5];}glGenBuffers(1,&g_cylinderBufferId);glBindBuffer(GL_ARRAY_BUFFER,g_cylinderBufferId);glBufferData(GL_ARRAY_BUFFER,sizeof(float)*size,v,GL_STATIC_DRAW);free(v);glEnableClientState(GL_VERTEX_ARRAY);glEnableClientState(GL_NORMAL_ARRAY);glVertexPointer(3,GL_FLOAT,sizeof(float)*floatsPerVertex,0);glNormalPointer(GL_FLOAT,sizeof(float)*floatsPerVertex,(const GLvoid *)(sizeof(float)*3));}//初始场景void sceneInit(void){GLint result;g_program=glCreateProgram();shaderAttachFromFile(g_program,GL_VERTEX_SHADER,"brick_v.glsl");shaderAttachFromFile(g_program,GL_FRAGMENT_SHADER,"brick_f.glsl");glLinkProgram(g_program);glGetProgramiv(g_program,GL_LINK_STATUS,&result);if(result==GL_FALSE){GLint length;char *log;glGetProgramiv(g_program,GL_INFO_LOG_LENGTH,&length);log=(char *)malloc(length);glGetProgramInfoLog(g_program,length,&result,log);fprintf(stderr,"sceneInit(): Program linking failed: %s\n",log);free(log);glDeleteProgram(g_program);g_program=0;}/* get uniform locations */g_programLightPositionLocation = glGetUniformLocation(g_program, "LightPosition");/* create cylinder */createCylinder(36);g_lightPosition[0]=-10.0f;g_lightPosition[1]=0.0f;g_lightPosition[2]=4.0f;glLoadIdentity();glTranslatef(0, 0, -4.0f);}//渲染场景void sceneRender(void){int i;glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);/* enable program and set uniform variables */glUseProgram(g_program);glUniform3fv(g_programLightPositionLocation, NUM_LIGHTS, g_lightPosition);/* render the cylinder */glDrawArrays(GL_TRIANGLE_STRIP, 0, g_cylinderNumVertices);/* disable program */glUseProgram(0);}


源文件下载地址:在csdn中,下载->高级搜索->ID号输入:sh15285118586->点击搜索。进入后下载相关源文件。


0 0
原创粉丝点击