opengl的光源问题,新手刚开始学,求教了!

zhangqilussg 2014-12-22 09:44:00
想做个点光源,但没有效果,只有环境光好漫反射光的,请问是哪里的问题?程序如下


//Provide a project with a blank window
#include "GL/glut.h"
#include "windows.h"
#include <iostream>
#include <string>
using namespace std;

#define DWORD unsigned long
#define FALSE 0

GLfloat xrot; // X Rotation ( NEW )
GLfloat yrot; // Y Rotation ( NEW )
GLfloat zrot; // Z Rotation ( NEW )

GLuint texture[1]; // 存储一个纹理

GLfloat LightAmbient[]= { 0.0f, 0.0f, 0.0f, 1.0f }; // 环境光参数
GLfloat LightDiffuse[]= { 0.0f, 0.0f, 0.0f, 1.0f }; // 漫射光参数
GLfloat LightPosition[]= { 0.0f, 0.0f, 1.0f, 1.0f }; // 光源位置
GLfloat a[] = { 0.0, 0.0, -1.0 }; //点光源射出方向
GLfloat mat_specular[] = { 0.0, 0.0, 0.0, 1.0 }; //材质
GLfloat mat_shininess[] = { 50.0 };
GLfloat light_specular[] = { 0.2, 0.2, 0.2, 1.0 };
GLfloat diffuseCoeff[] = { 1.0f, 1.0f, 1.0f, 1.0f };



bool LoadTexture(LPTSTR szFileName, GLuint &texid) //Creates Texture From A Bitmap File
{
HBITMAP hBMP; // Handle Of The Bitmap
BITMAP BMP; //Bitmap Structure

glGenTextures(1, &texid); //Create The Texture
hBMP=(HBITMAP)LoadImage(GetModuleHandle(NULL), szFileName, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE);

if (!hBMP) //Does The Bitmap Exist
return FALSE; //If Not Return False

GetObject(hBMP, sizeof(BMP), &BMP); //Get The Object
//hBMP Handle To Graphics Object
//sizeof(BMP) Size Of Buffer For Object Information
//&BMP Buffer For Object Information

glPixelStorei(GL_UNPACK_ALIGNMENT, 4); //Pixel Storage Mode (Word Alignment 4 Bytes)
//Typical Texture Generation Using Data From The Bitmap
glBindTexture(GL_TEXTURE_2D, texid); //Bind To The Texture ID
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); //Linear Min Filter
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); //Linear Mag Filter
glTexImage2D(GL_TEXTURE_2D, 0, 3, BMP.bmWidth, BMP.bmHeight, 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, BMP.bmBits);

DeleteObject(hBMP); //Delete The Object

return TRUE; //Loading Was Successful
}


//渲染函数
void RenderScene(void)
{ // 场景绘制
//清空
glClear(GL_COLOR_BUFFER_BIT);
//压栈,保留世界坐标位置
glPushMatrix();

//Add your code here
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度缓存
glLoadIdentity(); // 重置当前的模型观察矩阵
glTranslatef(0.0f,0.0f,-10.0f); // 移入屏幕 5 个单位

glRotatef(xrot,1.0f,0.0f,0.0f); // 绕X轴旋转
glRotatef(yrot,0.0f,1.0f,0.0f); // 绕Y轴旋转
glRotatef(zrot,0.0f,0.0f,1.0f); // 绕Z轴旋转


glBindTexture(GL_TEXTURE_2D, texture[0]); // 选择纹理

glBegin(GL_QUADS);
// 前面
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // 纹理和四边形的左下
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); // 纹理和四边形的右下
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); // 纹理和四边形的右上
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // 纹理和四边形的左上
// 后面
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // 纹理和四边形的右下
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); // 纹理和四边形的右上
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); // 纹理和四边形的左上
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); // 纹理和四边形的左下
// 顶面
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); // 纹理和四边形的左上
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // 纹理和四边形的左下
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f); // 纹理和四边形的右下
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); // 纹理和四边形的右上
// 底面
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // 纹理和四边形的右上
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f); // 纹理和四边形的左上
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); // 纹理和四边形的左下
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // 纹理和四边形的右下
// 右面
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); // 纹理和四边形的右下
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); // 纹理和四边形的右上
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); // 纹理和四边形的左上
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); // 纹理和四边形的左下
// 左面
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // 纹理和四边形的左下
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // 纹理和四边形的右下
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // 纹理和四边形的右上
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); // 纹理和四边形的左上
glEnd();

xrot+=0.05f; // X 轴旋转
yrot+=0.05f; // Y 轴旋转
//zrot+=0.3f; // Z 轴旋转

glutPostRedisplay();

//恢复世界坐标位置
glPopMatrix();
//切换双缓存
glutSwapBuffers();
}

///////////////////////////////////////////////////////////
void SetupRC(void)
{
//设置清屏颜色
//if(!LoadTexture("Skin/exp3.bmp",*texture))
//{
// return ; // 如果未能载入,返回
//}
LoadTexture("Skin/exp4.bmp",*texture);

glEnable(GL_TEXTURE_2D); // 启用纹理映射
glShadeModel(GL_SMOOTH); // 启用阴影平滑
glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // 黑色背景
glClearDepth(1.0f); // 设置深度缓存
glEnable(GL_DEPTH_TEST); // 启用深度测试
glDepthFunc(GL_LEQUAL); // 所作深度测试的类型
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // 真正精细的透视修正


glEnable(GL_COLOR_MATERIAL);
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, diffuseCoeff);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);


glEnable(GL_LIGHTING);
glLightfv(GL_LIGHT0, GL_AMBIENT, LightAmbient); // 设置环境光
glEnable(GL_LIGHT0); // 启用一号光源


glEnable(GL_LIGHTING);
glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse); // 设置漫射光
glLightfv(GL_LIGHT1, GL_POSITION,LightPosition); // 设置光源位置
glLightfv(GL_LIGHT1, GL_SPECULAR, light_specular);
glEnable(GL_LIGHT1);

glEnable(GL_LIGHTING); //设置点光源
glLightfv(GL_LIGHT3, GL_SPECULAR, light_specular);
glLightfv(GL_LIGHT2, GL_POSITION, LightPosition);
glLightf(GL_LIGHT2, GL_SPOT_CUTOFF, 40);
glLightfv(GL_LIGHT2, GL_SPOT_DIRECTION, a);
glLightf(GL_LIGHT2, GL_SPOT_EXPONENT, 2.0);
glEnable(GL_LIGHT2);



//glEnable(GL_LIGHTING); // 启用用0号灯光


}
///////////////////////////////////////////////////////////
void ChangeSize(int w, int h)
{
GLfloat fAspect;
if(h == 0)
h = 1;

//设置视口
glViewport(0, 0, w, h);

//获得屏幕宽高比
fAspect = (GLfloat)w/(GLfloat)h;

//切换到投影矩阵
glMatrixMode(GL_PROJECTION);

//重载为单位矩阵
glLoadIdentity();

//设置为透视图
gluPerspective(35.0f, fAspect, 1.0, 40.0);

//切换回模型矩阵
glMatrixMode(GL_MODELVIEW);

//重载为单位矩阵
glLoadIdentity();
}
///////////////////////////////////////////////////////////
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);

glutInitWindowSize(800, 600);
glutCreateWindow("Exp3:opengl texture");

glutReshapeFunc(ChangeSize);
glutDisplayFunc(RenderScene);
SetupRC();

glutMainLoop();

return 0;
}
...全文
93 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2014-12-23
  • 打赏
  • 举报
回复
搜网络教程“学OpenGL编3D游戏”。
fly_dragon_fly 2014-12-23
  • 打赏
  • 举报
回复
光源慢慢调 , 把其它光关掉,只用点光试一下,看你代码没有用到glcolor,把color material关掉, 点光的颜色也没有设置

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧