在这段代码中添加绘制纹理的代码在里面// 绘制太阳 glPushMatrix(); glRotatef(selfroat, 0.0f, 0.0f, 1.0f); //太阳自转 glColor3f(0.0f,1.0f, 1.0f); //glutWireSphere(69600, 20, 20); glMaterialfv(GL_FRONT, GL_SPECULAR, G_vMaterialSpecu); glMaterialf(GL_FRONT, GL_SHININESS, 60.0f); glutSolidSphere(69600, 20, 20); glPopMatrix();
时间: 2024-03-29 18:38:23 浏览: 16
在上述代码中添加绘制纹理的代码,需要先准备好纹理图片,并使用OpenGL的纹理映射功能将纹理应用到太阳的表面上。具体的代码如下:
// 加载纹理图片
GLuint textureID;
textureID = LoadTexture("sun_texture.jpg");
// 绑定纹理
glBindTexture(GL_TEXTURE_2D, textureID);
// 开启纹理映射功能
glEnable(GL_TEXTURE_2D);
// 绘制太阳
glPushMatrix();
glRotatef(selfroat, 0.0f, 0.0f, 1.0f); //太阳自转
// 设置材质和光照
glMaterialfv(GL_FRONT, GL_SPECULAR, G_vMaterialSpecu);
glMaterialf(GL_FRONT, GL_SHININESS, 60.0f);
// 绘制太阳球体
glutSolidSphere(69600, 20, 20);
// 关闭纹理映射功能
glDisable(GL_TEXTURE_2D);
glPopMatrix();
其中,LoadTexture() 函数是用于加载纹理图片的自定义函数,可以根据自己的需要进行修改。在绘制太阳之前,需要先绑定纹理并开启纹理映射功能,然后在绘制太阳的球体时,使用纹理映射的方式绘制表面。最后,需要在绘制完毕后关闭纹理映射功能。
相关问题
1.制作画布大小 2. 制作台体 3. 台体摆放位罝 4. 台体铺满画布 5.设定台体旋转角度 6.绘制纹理用OpenGL写个代码
好的,以下是一个简单的用OpenGL绘制3D画布和台体的示例代码:
```
#include <GL/glut.h>
// 定义画布大小
const int WIDTH = 800;
const int HEIGHT = 600;
// 定义台体的顶点坐标
GLfloat vertices[][3] = {
{-0.5, -0.5, 0.5},
{0.5, -0.5, 0.5},
{0.5, 0.5, 0.5},
{-0.5, 0.5, 0.5},
{-0.5, -0.5, -0.5},
{0.5, -0.5, -0.5},
{0.5, 0.5, -0.5},
{-0.5, 0.5, -0.5}
};
// 定义台体的面片索引
GLubyte indices[][4] = {
{0, 1, 2, 3},
{4, 5, 6, 7},
{0, 4, 7, 3},
{1, 5, 6, 2},
{0, 1, 5, 4},
{3, 2, 6, 7}
};
// 定义台体的纹理坐标
GLfloat texCoords[][2] = {
{0.0, 0.0},
{1.0, 0.0},
{1.0, 1.0},
{0.0, 1.0}
};
// 定义画布旋转角度
GLfloat angle = 0.0;
void init() {
glClearColor(0.0, 0.0, 0.0, 0.0);
glEnable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
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);
GLuint texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D(GL_TEXTURE_2D, 0, 3, 256, 256, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
glPushMatrix();
glLoadIdentity();
glTranslatef(0.5, 0.5, 0.0);
glRotatef(45.0, 0.0, 0.0, 1.0);
GLubyte texData[256][256][3];
for (int i = 0; i < 256; i++) {
for (int j = 0; j < 256; j++) {
texData[i][j][0] = (i + j) % 256;
texData[i][j][1] = (i * j) % 256;
texData[i][j][2] = i % 256;
}
}
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 256, 256, GL_RGB, GL_UNSIGNED_BYTE, texData);
glPopMatrix();
}
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);
glRotatef(angle, 0.0, 1.0, 0.0);
// 绘制台体
glBegin(GL_QUADS);
for (int i = 0; i < 6; i++) {
glTexCoord2fv(texCoords[0]);
glVertex3fv(vertices[indices[i][0]]);
glTexCoord2fv(texCoords[1]);
glVertex3fv(vertices[indices[i][1]]);
glTexCoord2fv(texCoords[2]);
glVertex3fv(vertices[indices[i][2]]);
glTexCoord2fv(texCoords[3]);
glVertex3fv(vertices[indices[i][3]]);
}
glEnd();
// 绘制画布
glColor3f(1.0, 1.0, 1.0);
glBegin(GL_QUADS);
glVertex3f(-1.0, -1.0, 0.0);
glVertex3f(1.0, -1.0, 0.0);
glVertex3f(1.0, 1.0, 0.0);
glVertex3f(-1.0, 1.0, 0.0);
glEnd();
glutSwapBuffers();
}
void reshape(int w, int h) {
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w <= h) {
glOrtho(-2.0, 2.0, -2.0 * (GLfloat) h / (GLfloat) w, 2.0 * (GLfloat) h / (GLfloat) w, -10.0, 10.0);
} else {
glOrtho(-2.0 * (GLfloat) w / (GLfloat) h, 2.0 * (GLfloat) w / (GLfloat) h, -2.0, 2.0, -10.0, 10.0);
}
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void spinDisplay() {
angle += 1.0;
if (angle > 360.0) {
angle -= 360.0;
}
glutPostRedisplay();
}
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(WIDTH, HEIGHT);
glutCreateWindow("3D Canvas");
glutReshapeFunc(reshape);
glutDisplayFunc(display);
glutIdleFunc(spinDisplay);
init();
glutMainLoop();
return 0;
}
```
这段代码使用OpenGL绘制了一个3D的画布和台体,并将画布和台体铺满整个窗口。您可以根据需要修改代码中的画布大小和台体的大小、纹理等参数。
利用opengl实现包含基本图元控制、动作及其控制、纹理、光照、半透明、等特效的特效,带有注释的代码
以下是一个基于OpenGL的简单场景实现代码,包含了基本图元控制、动作及其控制、纹理、光照、半透明等特效:
```c++
#include <GL/glut.h>
// 定义窗口大小
const int WIDTH = 800;
const int HEIGHT = 600;
// 定义角度变量
float angle = 0.0f;
// 初始化函数
void init() {
// 设置清除颜色为黑色
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
// 启用深度测试
glEnable(GL_DEPTH_TEST);
// 设置光照
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
GLfloat light_pos[] = {0.0f, 1.0f, 0.0f, 0.0f};
glLightfv(GL_LIGHT0, GL_POSITION, light_pos);
}
// 绘制函数
void display() {
// 清除颜色缓冲和深度缓冲
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// 设置模型视图矩阵
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.0f, 0.0f, -5.0f);
// 绘制立方体
glPushMatrix();
glRotatef(angle, 1.0f, 1.0f, 0.0f);
glColor4f(1.0f, 1.0f, 1.0f, 0.5f);
glutSolidCube(1.0f);
glPopMatrix();
// 交换前后缓冲
glutSwapBuffers();
}
// 更新函数
void update(int value) {
// 更新角度变量
angle += 1.0f;
if (angle > 360.0f) {
angle -= 360.0f;
}
// 重新绘制场景
glutPostRedisplay();
// 重复调用更新函数
glutTimerFunc(25, update, 0);
}
// 窗口大小变化处理函数
void reshape(int width, int height) {
// 设置视口
glViewport(0, 0, width, height);
// 设置投影矩阵
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f, (float)width / (float)height, 0.1f, 100.0f);
}
int main(int argc, char** argv) {
// 初始化GLUT
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(WIDTH, HEIGHT);
glutCreateWindow("OpenGL Scene");
// 初始化场景
init();
// 注册回调函数
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutTimerFunc(25, update, 0);
// 进入事件循环
glutMainLoop();
return 0;
}
```
以上代码实现了一个旋转的半透明立方体,通过GLUT库实现窗口和事件处理,使用OpenGL的深度测试和光照特性,包含了基本图元控制、动作及其控制、纹理、光照、半透明等特效。