将环境光的强度与漫射光的强度之和与纹理颜色相乘,再加上镜面光的部分。
.vp
attribute vec4 vVertex;
attribute vec3 vNormal;
uniform mat4 mvpMatrix;
uniform mat4 mvMatrix;
uniform mat3 normalMatrix;
uniform vec3 vLightPosition;
varying vec3 vVaryingNormal;
varying vec3 vVaryingLightDir;
void main(void)
{
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 colorMap;
varying vec3 vVaryingNormal;
varying vec3 vVaryingLightDir;
varying vec2 vTexCoords;
void main(void)
{
float diff = max(0.0, dot(normalize(vVaryingNormal), normalize(vVaryingLightDir)));
vFragColor = diff * diffuseColor;
vFragColor += ambientColor;
vFragColor *= texture2D(colorMap, vTexCoords);
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;
}
.cpp
其中头文件loadTGATexture.hpp源码在tga读取函数
#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 sphereBatch;
GLMatrixStack modelViewMatrix;
GLMatrixStack projectionMatrix;
GLGeometryTransform transformPipeline;
GLuint ADSTextureShader;
GLint locAmebient;
GLint locDiffuse;
GLint locSpecular;
GLint locLight;
GLint locMVP;
GLint locMV;
GLint locNM;
GLint locTexture;
GLuint texture;
void SetupRC(void)
{
glClearColor(0.0f,0.0f,0.0f,1.0f);
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
viewFrame.MoveForward(4.0f);
gltMakeSphere(sphereBatch,1.0f,26,13);
ADSTextureShader=gltLoadShaderPairWithAttributes("/Users/mac/Downloads/1/ADSTexture.vp","/Users/mac/Downloads/1/ADSTexture.fp",3,GLT_ATTRIBUTE_VERTEX,"vVertex",GLT_ATTRIBUTE_NORMAL,"vNormal",GLT_ATTRIBUTE_TEXTURE0,"vTexture0");
locAmebient=glGetUniformLocation(ADSTextureShader,"ambientColor");
locDiffuse=glGetUniformLocation(ADSTextureShader,"diffuseColor");
locSpecular=glGetUniformLocation(ADSTextureShader,"specularColor");
locLight=glGetUniformLocation(ADSTextureShader,"vLightPosition");
locMVP=glGetUniformLocation(ADSTextureShader,"mvpMatrix");
locNM=glGetUniformLocation(ADSTextureShader,"normalMatrix");
locMV=glGetUniformLocation(ADSTextureShader,"mvMatrix");
locTexture=glGetUniformLocation(ADSTextureShader,"colorMap");
glGenTextures(1,&texture);
glBindTexture(GL_TEXTURE_2D,texture);
LoadTGATexture("/Users/mac/Downloads/1/CoolTexture.tga",GL_LINEAR_MIPMAP_LINEAR,GL_LINEAR,GL_CLAMP_TO_EDGE);
}
void ShutdownRC(void)
{
glDeleteTextures(1,&texture);
}
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.2f, 0.2f, 0.2f, 1.0f };
GLfloat vDiffuseColor[] = { 1.0f, 1.0f, 1.0f, 1.0f};
GLfloat vSpecularColor[] = { 1.0f, 1.0f, 1.0f, 1.0f };
glBindTexture(GL_TEXTURE_2D, texture);
glUseProgram(ADSTextureShader);
glUniform4fv(locAmebient,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,0);
sphereBatch.Draw();
modelViewMatrix.PopMatrix();
glutSwapBuffers();
glutPostRedisplay();
}
void ChangeSize(int w,int h)
{
glViewport(0,0,w,h);
viewFrustum.SetPerspective(35.0f,float(w)/float(h),1.0f,100.f);
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("Lit Texture");
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;
}