.vp
#version 120
attribute vec4 vVertex;
attribute vec3 vNormal;
attribute vec2 vTexCoords0;
uniform mat4 mvpMatrix;
uniform mat4 mvMatrix;
uniform mat3 normalMatrix;
uniform vec3 vLightPosition;
varying vec3 vVaryingNormal;
varying vec3 vVaryingLightDir;
varying vec2 vVaryingTexCoord;
void main(void)
{
vVaryingTexCoord = vTexCoords0;
vVaryingNormal = normalMatrix * vNormal;
vec4 vPosition4 = mvMatrix * vVertex;
vec3 vPosition3 = vPosition4.xyz / vPosition4.w;
vVaryingLightDir = normalize(vLightPosition - vPosition3);
gl_Position = mvpMatrix * vVertex;
}
fp
#version 120
vec4 vFragColor;
uniform vec4 ambientColor;
uniform vec4 diffuseColor;
uniform vec4 specularColor;
uniform sampler2D cloudTexture;
uniform float dissolveFactor;
varying vec3 vVaryingNormal;
varying vec3 vVaryingLightDir;
varying vec2 vVaryingTexCoord;
void main(void)
{
vec4 vCloudSample = texture2D(cloudTexture, vVaryingTexCoord);
if(vCloudSample.r < dissolveFactor)
discard;
float diff = max(0.0, dot(normalize(vVaryingNormal), normalize(vVaryingLightDir)));
vFragColor = diff * diffuseColor;
vFragColor += ambientColor;
vec3 vReflection = normalize(reflect(-normalize(vVaryingLightDir), normalize(vVaryingNormal)));
float spec = max(0.0, dot(normalize(vVaryingNormal), vReflection));
if(diff != 0.0f) {
float fSpec = pow(spec, 128.0);
vFragColor.rgb += vec3(fSpec, fSpec, fSpec);
}
gl_FragColor=vFragColor;
}
main.cpp
#include<GLTools.h>
#include<GLMatrixStack.h>
#include<GLFrame.h>
#include<GLFrustum.h>
#include<GLGeometryTransform.h>
#include<StopWatch.h>
#include<math.h>
#include<GLUT/GLUT.h>
#include"loadTGATexture.hpp"
GLFrame viewFrame;
GLFrustum viewFrustum;
GLTriangleBatch torusBatch;
GLMatrixStack modelViewMatrix;
GLMatrixStack projectionMatrix;
GLGeometryTransform transformPipeline;
GLuint ADSDissloveShader;
GLint locAmbient;
GLint locDiffuse;
GLint locSpecular;
GLint locLight;
GLint locMVP;
GLint locMV;
GLint locNM;
GLint locTexture;
GLint locDissolveFactor;
GLuint cloudTexture;
void SetupRC(void)
{
glClearColor(0.0f,0.0f,0.0f,1.0f);
glEnable(GL_DEPTH_TEST);
viewFrame.MoveForward(4.0f);
gltMakeTorus(torusBatch,0.80f,0.25f,52,26);
ADSDissloveShader=gltLoadShaderPairWithAttributes("/Users/mac/Downloads/1/Dissolve.vp","/Users/mac/Downloads/1/Dissolve.fp",3,GLT_ATTRIBUTE_VERTEX,"vVertex",GLT_ATTRIBUTE_NORMAL,"vNormal",GLT_ATTRIBUTE_TEXTURE0,"vTexCoords0");
locAmbient=glGetUniformLocation(ADSDissloveShader,"ambientColor");
locDiffuse=glGetUniformLocation(ADSDissloveShader,"diffuseColor");
locSpecular = glGetUniformLocation(ADSDissloveShader, "specularColor");
locLight = glGetUniformLocation(ADSDissloveShader, "vLightPosition");
locMVP = glGetUniformLocation(ADSDissloveShader, "mvpMatrix");
locMV = glGetUniformLocation(ADSDissloveShader, "mvMatrix");
locNM = glGetUniformLocation(ADSDissloveShader, "normalMatrix");
locTexture = glGetUniformLocation(ADSDissloveShader, "cloudTexture");
locDissolveFactor = glGetUniformLocation(ADSDissloveShader, "dissolveFactor");
glGenTextures(1,&cloudTexture);
glBindTexture(GL_TEXTURE_1D,cloudTexture);
LoadTGATexture("/Users/mac/Downloads/1/Clouds.tga",GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_CLAMP_TO_EDGE);
}
void ShutdownRC(void)
{
glDeleteTextures(1,&cloudTexture);
}
void RenderScene(void)
{
static CStopWatch rotTimer;
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
modelViewMatrix.PushMatrix(viewFrame);
modelViewMatrix.Rotate(rotTimer.GetElapsedSeconds()*10.0f,0.0f,1.0f,0.0f);
GLfloat vEyeLight[] = { -100.0f, 100.0f, 100.0f };
GLfloat vAmbientColor[] = { 0.1f, 0.1f, 0.1f, 1.0f };
GLfloat vDiffuseColor[] = { 1.0f, 1.0f, 0.0f, 1.0f };
GLfloat vSpecularColor[] = { 1.0f, 1.0f, 1.0f, 1.0f };
glUseProgram(ADSDissloveShader);
glUniform4fv(locAmbient, 1, vAmbientColor);
glUniform4fv(locDiffuse, 1, vDiffuseColor);
glUniform4fv(locSpecular, 1, vSpecularColor);
glUniform3fv(locLight, 1, vEyeLight);
glUniformMatrix4fv(locMVP, 1, GL_FALSE, transformPipeline.GetModelViewProjectionMatrix());
glUniformMatrix4fv(locMV, 1, GL_FALSE, transformPipeline.GetModelViewMatrix());
glUniformMatrix3fv(locNM, 1, GL_FALSE, transformPipeline.GetNormalMatrix());
glUniform1i(locTexture, 1);
float fFactor=fmod(rotTimer.GetElapsedSeconds(),10.0f);//fmod函数,对浮点数进行取模求余
fFactor/=10.0f;
glUniform1f(locDissolveFactor,fFactor);
torusBatch.Draw();
modelViewMatrix.PopMatrix();
glutSwapBuffers();
glutPostRedisplay();
}
void ChangeSize(int w,int h)
{
if(h==0)
h=1;
glViewport(0,0,w,h);
viewFrustum.SetPerspective(35.0f,float(w)/float(h),1.0f,100.0f);
projectionMatrix.LoadMatrix(viewFrustum.GetProjectionMatrix());
transformPipeline.SetMatrixStacks(modelViewMatrix,projectionMatrix);
}
int main(int argc, char* argv[])
{
gltSetWorkingDirectory(argv[0]);
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL);
glutInitWindowSize(800, 600);
glutCreateWindow("Help me, I'm melting!");
glutReshapeFunc(ChangeSize);
glutDisplayFunc(RenderScene);
GLenum err = glewInit();
if (GLEW_OK != err) {
fprintf(stderr, "GLEW Error: %s\n", glewGetErrorString(err));
return 1;
}
SetupRC();
glutMainLoop();
ShutdownRC();
return 0;
}