我写了这样一个函数 int LoadGLTextures() { int Status=FALSE; AUX_RGBImageRec *TextureImage[1]; memset(TextureImage,0,sizeof(void *)*1); if (TextureImage[0]=LoadBMP("rose.bmp")) { Status=TRUE; glGenTextures(1, &texture[0]); glBindTexture(GL_TEXTURE_2D, texture[0]); glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); } if (TextureImage[0]) { if (TextureImage[0]->data) { free(TextureImage[0]->data); } free(TextureImage[0]); } return Status; },请问接下来怎么写代码才能完成OpenGL纹理贴图呢?
时间: 2024-04-02 09:31:12 浏览: 20
完成 OpenGL 纹理贴图需要在绘制图形时启用纹理功能并设置纹理坐标,在片元着色器中使用纹理坐标获取纹理颜色。
下面是一个简单的例子,假设你已经有一个能够绘制一个矩形的程序:
```
void drawRect()
{
// 定义矩形的四个顶点坐标和纹理坐标
GLfloat vertices[] = {
// 顶点坐标 纹理坐标
-0.5f, 0.5f, 0.0f, 0.0f, 1.0f, // 左上角
0.5f, 0.5f, 0.0f, 1.0f, 1.0f, // 右上角
0.5f, -0.5f, 0.0f, 1.0f, 0.0f, // 右下角
-0.5f, -0.5f, 0.0f, 0.0f, 0.0f // 左下角
};
// 定义矩形的索引
GLuint indices[] = {
0, 1, 2,
0, 2, 3
};
// 创建 VBO 和 EBO 并绑定数据
GLuint VBO, EBO;
glGenBuffers(1, &VBO);
glGenBuffers(1, &EBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
// 设置顶点属性指针
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), (void*)0);
glEnableVertexAttribArray(0);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), (void*)(3 * sizeof(GLfloat)));
glEnableVertexAttribArray(1);
// 创建纹理并绑定纹理数据
GLuint texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
int width, height, nrChannels;
stbi_set_flip_vertically_on_load(true); // 加载图片时翻转 y 轴
unsigned char* data = stbi_load("rose.bmp", &width, &height, &nrChannels, 0);
if (data)
{
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
glGenerateMipmap(GL_TEXTURE_2D);
stbi_image_free(data);
}
else
{
std::cout << "Failed to load texture" << std::endl;
}
// 绘制矩形
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
// 解除绑定
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glBindTexture(GL_TEXTURE_2D, 0);
}
```
在这个例子中,我们先定义了矩形的四个顶点坐标和纹理坐标,然后创建了 VBO 和 EBO 并绑定了数据。接着设置了顶点属性指针,使得顶点着色器能够正确地获取顶点数据。然后创建了纹理并绑定纹理数据,最后在绘制矩形时启用纹理功能并设置纹理坐标。
注意,在这个例子中我们使用了 stb_image 库来加载纹理文件,需要提前下载和安装。另外,这个例子中的顶点着色器和片元着色器都比较简单,只是简单地将顶点坐标和纹理坐标传递给片元着色器,并在片元着色器中使用纹理坐标获取纹理颜色。你可以根据实际情况进行修改。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)