Xcode+Opengl学习(10)点光源漫反射

光强确定
要确定一个指定顶点上的光线的强度,需要两个向量,一个是向量是光源的方向,用视觉坐标光源位置减去定点位置确定;另一个向量是表面法线,注意两个向量都要是单位向量。两个向量点乘,会得到两向量夹角的余弦值,余弦值越大,说明光照强度越强,当余弦值为1,说明光线正好照在顶点上。用点乘积的值与顶点的一个颜色值相乘,得到一个基于顶点光线强度的光照颜色值。具体见.vp
main.cp



#include<GLTools.h>
#include<GLMatrixStack.h>
#include<GLFrame.h>
#include<GLFrustum.h>
#include<GLMatrixStack.h>
#include<GLGeometryTransform.h>
#include<StopWatch.h>

#include<math.h>
#include<GLUT/GLUT.h>


GLFrame viewFrame;
GLFrustum viewFrustum;
GLTriangleBatch sphereBatch;
GLMatrixStack modelViewMatrix;
GLMatrixStack projectionMatrix;
GLGeometryTransform transformPipeline;
GLShaderManager shaderManager;

GLuint diffuseLightShader;
GLint locColor;
GLint locLight;
GLint locMVP;
GLint locMV;
GLint locNM;

void SetupRC()
{
    glClearColor(0.3f,0.3f,0.3f,1.0f);

    glEnable(GL_DEPTH_TEST);
    glEnable(GL_CULL_FACE);

    viewFrame.MoveForward(4.0f);

    gltMakeSphere(sphereBatch,1.0f,26,13);

    diffuseLightShader=gltLoadShaderPairWithAttributes("/Users/mac/Downloads/1/DiffuseLight.vp","/Users/mac/Downloads/1/DiffuseLight.fp",2,GLT_ATTRIBUTE_VERTEX,"vVertex",GLT_ATTRIBUTE_NORMAL,"vNormal");

    locColor=glGetUniformLocation(diffuseLightShader,"diffuseColor");
    locLight=glGetUniformLocation(diffuseLightShader,"vLightPosition");
    locMVP=glGetUniformLocation(diffuseLightShader,"mvpMatrix");
    locMV=glGetUniformLocation(diffuseLightShader,"mvMatrix");
    locNM=glGetUniformLocation(diffuseLightShader,"normalMatrix");

}
void ShutdownRC(void)
{

}

void RenderScene(void)
{
    static CStopWatch rotTimer;
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

    modelViewMatrix.PushMatrix(viewFrame);
    modelViewMatrix.Rotate(rotTimer.GetElapsedSeconds()*222.0f,0.0f,1.0f,0.0f);

    GLfloat vEyeLight[]={-100.0f,100.0f,10.0f};
    GLfloat vDiffuseColor[]={1.0f,1.0,0.0f,1.0f};

    glUseProgram(diffuseLightShader);
    glUniform4fv(locColor,1,vDiffuseColor);
    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());
    sphereBatch.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("Simple Diffuse Lighting");
    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;
}



.vp

#version 120

attribute vec4 vVertex;
attribute vec3 vNormal;

uniform vec4	diffuseColor;	
uniform vec3	vLightPosition;
uniform mat4	mvpMatrix;
uniform mat4	mvMatrix;
uniform mat3	normalMatrix;

varying vec4 vVaryingColor;

void main(void) 
    { 
    // Get surface normal in eye coordinates
    vec3 vEyeNormal = normalMatrix * vNormal;

    // Get vertex position in eye coordinates
    vec4 vPosition4 = mvMatrix * vVertex;
    vec3 vPosition3 = vPosition4.xyz / vPosition4.w;

    // Get vector to light source
    vec3 vLightDir = normalize(vLightPosition - vPosition3);

    // Dot product gives us diffuse intensity
    float diff = max(0.0, dot(vEyeNormal, vLightDir));

    // Multiply intensity by diffuse color
    vVaryingColor.rgb = diff * diffuseColor.rgb;
    vVaryingColor.a = diffuseColor.a;

    // Let's not forget to transform the geometry
    gl_Position = mvpMatrix * vVertex;
    }

.fp

#version 120

varying vec4 vVaryingColor;

void main(void)
   { 
   gl_FragColor = vVaryingColor;
   }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值