glEnable(GL_COLOR_MATERIAL) 的作用

#include <GL/glut.h> #include <stdlib.h> #include <stdio.h> #include <SOIL.h> // 纹理ID数组 GLuint textures[3]; // 光照设置 void initLighting() { // 启用光照 glEnable(GL_LIGHTING); // 光源1 (点光源) GLfloat light0_ambient[] = {0.2, 0.2, 0.2, 1.0}; GLfloat light0_diffuse[] = {1.0, 1.0, 1.0, 1.0}; GLfloat light0_specular[] = {1.0, 1.0, 1.0, 1.0}; GLfloat light0_position[] = {1.0, 1.0, 1.0, 1.0}; glLightfv(GL_LIGHT0, GL_AMBIENT, light0_ambient); glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse); glLightfv(GL_LIGHT0, GL_SPECULAR, light0_specular); glLightfv(GL_LIGHT0, GL_POSITION, light0_position); glEnable(GL_LIGHT0); // 光源2 (平行光) GLfloat light1_ambient[] = {0.1, 0.1, 0.1, 1.0}; GLfloat light1_diffuse[] = {0.8, 0.8, 0.8, 1.0}; GLfloat light1_specular[] = {0.5, 0.5, 0.5, 1.0}; GLfloat light1_position[] = {-1.0, -1.0, -1.0, 0.0}; // w=0表示平行光 glLightfv(GL_LIGHT1, GL_AMBIENT, light1_ambient); glLightfv(GL_LIGHT1, GL_DIFFUSE, light1_diffuse); glLightfv(GL_LIGHT1, GL_SPECULAR, light1_specular); glLightfv(GL_LIGHT1, GL_POSITION, light1_position); glEnable(GL_LIGHT1); } // 加载纹理 void loadTextures() { glGenTextures(3, textures); // 纹理1 glBindTexture(GL_TEXTURE_2D, textures[0]); int width, height; unsigned char* image = SOIL_load_image("texture1.jpg", &width, &height, 0, SOIL_LOAD_RGB); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image); SOIL_free_image_data(image); 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_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // 纹理2 glBindTexture(GL_TEXTURE_2D, textures[1]); image = SOIL_load_image("texture2.jpg", &width, &height, 0, SOIL_LOAD_RGB); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image); SOIL_free_image_data(image); 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_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // 纹理3 (用于另一个物体) glBindTexture(GL_TEXTURE_2D, textures[2]); image = SOIL_load_image("texture3.jpg", &width, &height, 0, SOIL_LOAD_RGB); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image); SOIL_free_image_data(image); 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_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); } // 绘制立方体 void drawCube() { glBegin(GL_QUADS); // 前面 glNormal3f(0.0, 0.0, 1.0); glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0, 1.0); glTexCoord2f(1.0, 0.0); glVertex3f(1.0, -1.0, 1.0); glTexCoord2f(1.0, 1.0); glVertex3f(1.0, 1.0, 1.0); glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 1.0, 1.0); // 后面 glNormal3f(0.0, 0.0, -1.0); glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, -1.0, -1.0); glTexCoord2f(1.0, 1.0); glVertex3f(-1.0, 1.0, -1.0); glTexCoord2f(0.0, 1.0); glVertex3f(1.0, 1.0, -1.0); glTexCoord2f(0.0, 0.0); glVertex3f(1.0, -1.0, -1.0); // 上面 glNormal3f(0.0, 1.0, 0.0); glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 1.0, -1.0); glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, 1.0, 1.0); glTexCoord2f(1.0, 0.0); glVertex3f(1.0, 1.0, 1.0); glTexCoord2f(1.0, 1.0); glVertex3f(1.0, 1.0, -1.0); // 下面 glNormal3f(0.0, -1.0, 0.0); glTexCoord2f(1.0, 1.0); glVertex3f(-1.0, -1.0, -1.0); glTexCoord2f(0.0, 1.0); glVertex3f(1.0, -1.0, -1.0); glTexCoord2f(0.0, 0.0); glVertex3f(1.0, -1.0, 1.0); glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, -1.0, 1.0); // 右面 glNormal3f(1.0, 0.0, 0.0); glTexCoord2f(1.0, 0.0); glVertex3f(1.0, -1.0, -1.0); glTexCoord2f(1.0, 1.0); glVertex3f(1.0, 1.0, -1.0); glTexCoord2f(0.0, 1.0); glVertex3f(1.0, 1.0, 1.0); glTexCoord2f(0.0, 0.0); glVertex3f(1.0, -1.0, 1.0); // 左面 glNormal3f(-1.0, 0.0, 0.0); glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0, -1.0); glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, -1.0, 1.0); glTexCoord2f(1.0, 1.0); glVertex3f(-1.0, 1.0, 1.0); glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 1.0, -1.0); glEnd(); } // 绘制球体 void drawSphere() { glutSolidSphere(1.0, 50, 50); } // 显示函数 void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); // 设置材质1 (用于立方体) GLfloat mat_ambient1[] = {0.7, 0.7, 0.7, 1.0}; GLfloat mat_diffuse1[] = {0.8, 0.8, 0.8, 1.0}; GLfloat mat_specular1[] = {1.0, 1.0, 1.0, 1.0}; GLfloat mat_shininess1[] = {50.0}; glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient1); glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse1); glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular1); glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess1); // 绘制带纹理的立方体 (使用两种纹理) glEnable(GL_TEXTURE_2D); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); // 前面和后面使用纹理1 glBindTexture(GL_TEXTURE_2D, textures[0]); glPushMatrix(); glTranslatef(-2.0, 0.0, 0.0); glRotatef(30, 1.0, 1.0, 0.0); drawCube(); glPopMatrix(); // 设置材质2 (用于球体) GLfloat mat_ambient2[] = {0.2, 0.2, 0.5, 1.0}; GLfloat mat_diffuse2[] = {0.3, 0.3, 0.8, 1.0}; GLfloat mat_specular2[] = {0.8, 0.8, 0.8, 1.0}; GLfloat mat_shininess2[] = {30.0}; glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient2); glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse2); glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular2); glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess2); // 绘制带纹理的球体 (使用不同纹理) glBindTexture(GL_TEXTURE_2D, textures[2]); glPushMatrix(); glTranslatef(2.0, 0.0, 0.0); drawSphere(); glPopMatrix(); glDisable(GL_TEXTURE_2D); glutSwapBuffers(); } // 键盘回调函数 void keyboard(unsigned char key, int x, int y) { switch (key) { case '1': glShadeModel(GL_FLAT); break; case '2': glShadeModel(GL_SMOOTH); break; case 27: // ESC键 exit(0); break; } glutPostRedisplay(); } // 窗口大小调整 void reshape(int w, int h) { glViewport(0, 0, (GLsizei)w, (GLsizei)h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(60.0, (GLfloat)w / (GLfloat)h, 1.0, 20.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } // 初始化函数 void init() { glClearColor(0.0, 0.0, 0.0, 0.0); glEnable(GL_DEPTH_TEST); initLighting(); loadTextures(); // 默认使用平滑着色 glShadeModel(GL_SMOOTH); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(800, 600); glutInitWindowPosition(100, 100); glutCreateWindow("真实感图形生成实验"); init(); glutDisplayFunc(display); glutReshapeFunc(reshape); glutKeyboardFunc(keyboard); glutMainLoop(); return 0; }
06-11
import pygame from pygame.locals import * from OpenGL.GL import * from OpenGL.GLU import * import math import random # 初始化Pygame pygame.init() width, height = 800, 600 screen = pygame.display.set_mode((width, height), DOUBLEBUF | OPENGL) pygame.display.set_caption("3D水晶玫瑰") clock = pygame.time.Clock() # 定义水晶材质(透明、反光的蓝紫色调) def set_crystal_material(): glMaterialfv(GL_FRONT, GL_AMBIENT, [0.2, 0.3, 0.8, 0.7]) # 环境光 glMaterialfv(GL_FRONT, GL_DIFFUSE, [0.5, 0.6, 1.0, 0.8]) # 漫反射 glMaterialfv(GL_FRONT, GL_SPECULAR, [0.8, 0.9, 1.0, 0.9]) # 镜面反射 glMaterialfv(GL_FRONT, GL_SHININESS, 50.0) # 反光度 # 绘制玫瑰花瓣(单个花瓣的3D模型) def draw_petal(): glBegin(GL_QUADS) # 花瓣正面 glVertex3f(-1, 0, -1) glVertex3f(1, 0, -1) glVertex3f(1, 3, 1) glVertex3f(-1, 3, 1) # 花瓣背面 glVertex3f(-1, 3, 1) glVertex3f(1, 3, 1) glVertex3f(1, 0, -1) glVertex3f(-1, 0, -1) glEnd() # 绘制完整玫瑰 def draw_rose(): set_crystal_material() glPushMatrix() glScalef(0.5, 0.5, 0.5) # 缩放玫瑰大小 # 绘制多层花瓣(模拟玫瑰结构) petal_count = 12 for i in range(petal_count): glPushMatrix() angle = math.radians(360 / petal_count * i) glRotatef(angle, 0, 1, 0) # 绕Y轴旋转花瓣 glTranslatef(0, 0, 0.5 * i / petal_count) # 分层 draw_petal() glPopMatrix() # 绘制花茎 glPushMatrix() glTranslatef(0, -2, 0) glScalef(0.2, 3, 0.2) glColor4f(0.2, 0.8, 0.2, 0.7) # 茎的绿色调 glutSolidCube(1) glPopMatrix() glPopMatrix() # 绘制环绕粒子(模拟水晶碎片) def draw_particles(): glPushMatrix() glColor4f(0.7, 0.8, 1.0, 0.6) # 粒子颜色 particle_count = 5 for i in range(particle_count): glPushMatrix() angle = math.radians(360 / particle_count * i + pygame.time.get_ticks() * 0.01) distance = 5 + random.random() * 2 glTranslatef(math.cos(angle) * distance, 0, math.sin(angle) * distance) glScalef(0.3, 0.3, 0.3) glutSolidSphere(1, 10, 10) # 粒子形状 glPopMatrix() glPopMatrix() # 主循环 glEnable(GL_DEPTH_TEST) glEnable(GL_BLEND) glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) glEnable(GL_LIGHTING) glEnable(GL_LIGHT0) glLightfv(GL_LIGHT0, GL_POSITION, [1, 1, 1, 0]) # 光源位置 running = True rotation_y = 0 while running: for event in pygame.event.get(): if event.type == QUIT: running = False # 清空屏幕 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) glLoadIdentity() gluLookAt(0, 0, 10, # 相机位置 0, 0, 0, # 观察点 0, 1, 0) # 上方向 # 旋转玫瑰 rotation_y += 0.5 glRotatef(rotation_y, 0, 1, 0) glRotatef(30, 1, 0, 0) # 轻微倾斜 # 绘制场景 draw_rose() draw_particles() pygame.display.flip() clock.tick(60) pygame.quit() 运行
11-03
// 提示:在合适的地方修改或添加代码 #include <GL/freeglut.h> #include<stdio.h> #include<iostream> // 评测代码所用头文件-开始 #include<opencv2/core/core.hpp> #include<opencv2/highgui/highgui.hpp> #include<opencv2/imgproc/imgproc.hpp> using namespace std; // 评测代码所用头文件-结束 // 请在此添加你的代码 /********** Begin ********/ GLfloat points1[4][3] = { }; GLfloat Colors1[4][3] = { }; int vertice1[4][3] = { }; /********** End **********/ void InitGL(GLvoid) { glShadeModel(GL_SMOOTH); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClearDepth(1.0f); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glEnable(GL_COLOR_MATERIAL); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); } void Create() //创建三棱锥 { glBegin(GL_TRIANGLES); for (int i = 0; i < 4; i++) { glColor3fv(Colors1[i]); for (int j = 0; j < 3; j++) { int VtxId = vertice1[i][j]; glVertex3fv(points1[VtxId]); } } glEnd(); } void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); // 请在此添加你的代码 /********** Begin ********/ /********** End **********/ Create(); //三棱锥 glPopMatrix(); glutSwapBuffers(); } void reshape(int width, int height) { if (height == 0) height = 1; glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0f, (GLfloat)width / (GLfloat)height, 0.1f, 100.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitWindowPosition(100, 100); glutInitWindowSize(400, 400); glutCreateWindow("几何变换示例"); InitGL(); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMainLoopEvent();
最新发布
11-27
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值