Xcode+Opengl學習(12)紋理+光強

將環境光的強度與漫射光的強度之和與紋理顏色相乘,再加上鏡面光的部分。
.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;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章