欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > c/c++ >内容正文

c/c++

C++ opengl 点光源

发布时间:2025/3/15 c/c++ 45 豆豆
生活随笔 收集整理的这篇文章主要介绍了 C++ opengl 点光源 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

关键源码如下:

light.h

#pragma once #include "ggl.h" class Light { protected:GLenum mLightIdentifier;Light(); public:void SetAmbientColor(float r, float g, float b, float a); //设置环境光void SetDiffuseColor(float r, float g, float b, float a); //设置漫反射void SetSpecularColor(float r, float g, float b, float a); //设置镜面反射void Enable(); }; class DirectionLight :public Light { public:DirectionLight(GLenum light);void SetPosition(float x, float y, float z); };class PointLight :public Light { public:PointLight(GLenum light); //使用的OPenGL中哪一个光源void SetPosition(float x, float y, float z); //设置位置,其次为1.0表示点光源void SetConstAttenuation(float v); //设置常数的衰减系数void SetLinearAttenuation(float v); //设置线性的衰减系数void SetQuadricAttenuation(float v); //设置平方的衰减系数 };

light.cpp

#include "light.h" Light::Light() {} void Light::SetAmbientColor(float r, float g, float b, float a) {float ambientColor[] = { r,g,b,a };glLightfv(mLightIdentifier, GL_AMBIENT, ambientColor); } void Light::SetDiffuseColor(float r, float g, float b, float a) {float diffuseColor[] = { r,g,b,a };glLightfv(mLightIdentifier, GL_DIFFUSE, diffuseColor); } void Light::SetSpecularColor(float r, float g, float b, float a) {float specularColor[] = { r,g,b,a };glLightfv(mLightIdentifier, GL_SPECULAR, specularColor); } void Light::Enable() {glEnable(GL_LIGHTING);glEnable(mLightIdentifier); } DirectionLight::DirectionLight(GLenum light) {mLightIdentifier = light; } void DirectionLight::SetPosition(float x, float y, float z) {float pos[] = { x,y,z,0.0f };glLightfv(mLightIdentifier, GL_POSITION, pos); }PointLight::PointLight(GLenum light) {mLightIdentifier = light; }void PointLight::SetPosition(float x, float y, float z) {float pos[] = { x,y,z,1.0 }; //其次为1.0表示点光源glLightfv(mLightIdentifier, GL_POSITION, pos); }void PointLight::SetConstAttenuation(float v) {glLightf(mLightIdentifier, GL_CONSTANT_ATTENUATION, v); }void PointLight::SetLinearAttenuation(float v) {glLightf(mLightIdentifier, GL_LINEAR_ATTENUATION, v); }void PointLight::SetQuadricAttenuation(float v) {glLightf(mLightIdentifier, GL_QUADRATIC_ATTENUATION, v); }

scene.cpp

#include "scene.h" #include "utils.h" #include "skybox.h" #include "model.h" #include "light.h" #include "ground.h" SkyBox skybox; Model model; Ground ground; DirectionLight light(GL_LIGHT0); PointLight light1(GL_LIGHT1); void Init() {glMatrixMode(GL_PROJECTION);gluPerspective(50.0f, 800.0f / 600.0f, 0.1f, 1000.0f);glMatrixMode(GL_MODELVIEW);glLoadIdentity();skybox.Init("Res/");model.Init("Res/Sphere.obj");model.mTexture = CreateTexture2DFromBMP("Res/earth.bmp");light.SetAmbientColor(0.1f, 0.1f, 0.1f, 1.0f);light.SetDiffuseColor(0.8f, 0.8f, 0.8f, 1.0f);light.SetSpecularColor(1.0f, 1.0f, 1.0f, 1.0f);light.SetPosition(0.0f, 1.0f, 0.0f);light1.SetAmbientColor(0.1f, 0.1f, 0.1f, 1.0f);light1.SetDiffuseColor(0.8f, 0.8f, 0.8f, 1.0f);light1.SetSpecularColor(1.0f, 1.0f, 1.0f, 1.0f);light1.SetPosition(0.0f, 0.0f, 0.0f); //与摄像机同位置light1.SetConstAttenuation(1.0f);light1.SetLinearAttenuation(0.2f);model.SetAmbientMaterial(0.1f, 0.1f, 0.1f, 1.0f);model.SetDiffuseMaterial(0.4f, 0.4f, 0.4f, 1.0f);model.SetSpecularMaterial(1.0f, 1.0f, 1.0f, 1.0f);ground.SetAmbientMaterial(0.1f, 0.1f, 0.1f, 1.0f);ground.SetDiffuseMaterial(0.4f, 0.4f, 0.4f, 1.0f);ground.SetSpecularMaterial(0.0f, 0.0f, 0.0f, 1.0f); } void Draw() {glClearColor(0.0f, 0.0f, 0.0f, 1.0f);glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);light1.Enable();skybox.Draw();model.Draw();ground.Draw(); }

 

接下来看下截图:

点光源的:

方向光的:

差别还是挺大的!!!!!!!!!

新人创作打卡挑战赛发博客就能抽奖!定制产品红包拿不停!

总结

以上是生活随笔为你收集整理的C++ opengl 点光源的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。