opengl+灯光+纹理+阴影
时间: 2023-11-12 07:08:23 浏览: 42
这段引用代码主要是关于OpenGL中如何实现灯光和阴影效果的。其中,首先需要创建一个阴影贴图,然后将场景渲染到阴影贴图中。在渲染场景时,需要设置摄像机和正交矩阵,并将模型矩阵传递给着色器进行绘制。此外,还需要设置光源的位置和方向等参数,以实现灯光效果。在绘制完成后,需要将渲染结果绑定到默认帧缓冲中,以显示到屏幕上。
相关问题
opengl+SOIL灯光+纹理+阴影
OpenGL是一种跨平台的图形API,SOIL是一个用于加载和保存图像的库,灯光、纹理和阴影是OpenGL中常用的图形渲染技术。其中,灯光可以模拟光照效果,纹理可以为物体表面添加图案或者颜色,阴影可以增强场景的真实感。如果想要使用OpenGL进行图形渲染,可以使用SOIL库加载纹理,然后使用OpenGL的灯光和阴影技术来渲染场景。
以下是一个使用OpenGL、SOIL、灯光、纹理和阴影的范例代码:
```C++
// OpenGL代码
#include <GL/glut.h>
#include <SOIL/SOIL.h>
GLuint texture; // 纹理ID
void init(void) {
glEnable(GL_DEPTH_TEST); // 开启深度测试
glEnable(GL_LIGHTING); // 开启灯光
glEnable(GL_LIGHT0); // 开启0号灯光
glEnable(GL_TEXTURE_2D); // 开启纹理
texture = SOIL_load_OGL_texture("texture.jpg", SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, SOIL_FLAG_INVERT_Y); // 加载纹理
}
void display(void) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清空颜色缓冲区和深度缓冲区
glMatrixMode(GL_MODELVIEW); // 模型视图矩阵模式
glLoadIdentity(); // 重置矩阵
gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); // 设置视角
GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 }; // 灯光位置
glLightfv(GL_LIGHT0, GL_POSITION, light_position); // 设置灯光位置
glBindTexture(GL_TEXTURE_2D, texture); // 绑定纹理
glBegin(GL_QUADS); // 绘制四边形
glNormal3f(0.0, 0.0, 1.0); // 设置法线
glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0, 0.0); // 设置纹理坐标和顶点坐标
glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 1.0, 0.0);
glTexCoord2f(1.0, 1.0); glVertex3f(1.0, 1.0, 0.0);
glTexCoord2f(1.0, 0.0); glVertex3f(1.0, -1.0, 0.0);
glEnd(); // 结束绘制
glutSwapBuffers(); // 交换缓冲区
}
int main(int argc, char** argv) {
glutInit(&argc, argv); // 初始化GLUT
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); // 设置显示模式
glutInitWindowSize(500, 500); // 设置窗口大小
glutCreateWindow("OpenGL"); // 创建窗口
init(); // 初始化
glutDisplayFunc(display); // 注册回调函数
glutMainLoop(); // 进入主循环
return 0;
}
```
opengl+SOIL绘制茶壶+泳圈+长方体并加上灯光+纹理+阴影实现完整代码
以下是使用OpenGL和SOIL库绘制茶壶、泳圈和长方体,并添加灯光、纹理和阴影的完整代码:
```c++
#include <GL/glut.h>
#include <SOIL/SOIL.h>
// 定义纹理ID
GLuint texTeapot, texRing, texBox;
// 定义材质
GLfloat matTeapot[] = { 0.5, 0.5, 0.5, 1.0 };
GLfloat matRing[] = { 0.5, 0.5, 0.5, 1.0 };
GLfloat matBox[] = { 0.5, 0.5, 0.5, 1.0 };
// 定义光源
GLfloat lightPos[] = { 0.0, 5.0, 5.0, 1.0 };
GLfloat lightAmb[] = { 0.2, 0.2, 0.2, 1.0 };
GLfloat lightDif[] = { 0.8, 0.8, 0.8, 1.0 };
GLfloat lightSpc[] = { 0.5, 0.5, 0.5, 1.0 };
// 定义阴影
GLfloat shadowMat[16] = { 0.0 };
GLfloat groundPlane[4] = { 0.0, 1.0, 0.0, 0.0 };
GLfloat groundShadow[4][4] = { 0.0 };
// 绘制茶壶
void drawTeapot() {
glBindTexture(GL_TEXTURE_2D, texTeapot);
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, matTeapot);
glutSolidTeapot(1.0);
}
// 绘制泳圈
void drawRing() {
glBindTexture(GL_TEXTURE_2D, texRing);
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, matRing);
glutSolidTorus(0.2, 1.0, 20, 20);
}
// 绘制长方体
void drawBox() {
glBindTexture(GL_TEXTURE_2D, texBox);
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, matBox);
glutSolidCube(1.0);
}
// 绘制阴影
void drawShadow() {
glDisable(GL_LIGHTING);
glDisable(GL_TEXTURE_2D);
glPushMatrix();
glMultMatrixf((GLfloat *)groundShadow);
glColor3f(0.0, 0.0, 0.0);
drawTeapot();
drawRing();
drawBox();
glPopMatrix();
glEnable(GL_TEXTURE_2D);
glEnable(GL_LIGHTING);
}
// 初始化
void init() {
// 加载纹理
texTeapot = SOIL_load_OGL_texture("teapot.jpg", SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, SOIL_FLAG_INVERT_Y);
texRing = SOIL_load_OGL_texture("ring.jpg", SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, SOIL_FLAG_INVERT_Y);
texBox = SOIL_load_OGL_texture("box.jpg", SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, SOIL_FLAG_INVERT_Y);
// 设置纹理参数
glBindTexture(GL_TEXTURE_2D, texTeapot);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glBindTexture(GL_TEXTURE_2D, texRing);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glBindTexture(GL_TEXTURE_2D, texBox);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
// 设置材质
glMaterialf(GL_FRONT, GL_SHININESS, 128.0);
// 设置光源
glLightfv(GL_LIGHT0, GL_POSITION, lightPos);
glLightfv(GL_LIGHT0, GL_AMBIENT, lightAmb);
glLightfv(GL_LIGHT0, GL_DIFFUSE, lightDif);
glLightfv(GL_LIGHT0, GL_SPECULAR, lightSpc);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHTING);
// 设置阴影
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.0, 0.0, -4.0);
glGetFloatv(GL_MODELVIEW_MATRIX, shadowMat);
glLoadIdentity();
glTranslatef(0.0, -1.0, 0.0);
glLightfv(GL_LIGHT0, GL_POSITION, lightPos);
glDisable(GL_LIGHTING);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glPushMatrix();
glMultMatrixf((GLfloat *)shadowMat);
glGetFloatv(GL_MODELVIEW_MATRIX, (GLfloat *)groundShadow);
glPopMatrix();
glDisable(GL_BLEND);
glEnable(GL_LIGHTING);
}
// 显示回调函数
void display() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// 绘制阴影
drawShadow();
// 绘制物体
glEnable(GL_TEXTURE_2D);
drawTeapot();
drawRing();
drawBox();
glDisable(GL_TEXTURE_2D);
glutSwapBuffers();
}
// 窗口大小改变回调函数
void reshape(int w, int h) {
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0, (GLfloat)w / (GLfloat)h, 1.0, 20.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.0, 0.0, -4.0);
}
// 主函数
int main(int argc, char *argv[]) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(800, 600);
glutCreateWindow("OpenGL Demo");
glutDisplayFunc(display);
glutReshapeFunc(reshape);
init();
glutMainLoop();
return 0;
}
```