glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR)
时间: 2023-09-02 19:06:57 浏览: 43
这行代码是什么意思?
这行代码是OpenGL中设置纹理过滤器的函数。其中,第一个参数表示要设置的纹理目标,这里是2D纹理;第二个参数表示要设置的过滤器类型,这里是纹理放大过滤器;第三个参数表示具体的过滤器方式,这里是线性过滤器。这行代码的作用是将2D纹理的放大过滤器设置为线性过滤器,以平滑纹理的放大效果。
相关问题
我写了这样一个函数 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纹理贴图呢?
完成 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 库来加载纹理文件,需要提前下载和安装。另外,这个例子中的顶点着色器和片元着色器都比较简单,只是简单地将顶点坐标和纹理坐标传递给片元着色器,并在片元着色器中使用纹理坐标获取纹理颜色。你可以根据实际情况进行修改。
class MyGLWidget : public QOpenGLWidget, protected QOpenGLFunctions { Q_OBJECT public: MyGLWidget(QWidget *parent = nullptr) : QOpenGLWidget(parent) {} void setImage(cv::Mat image) { m_image = image; update(); } void stopImage(bool) {} protected: protected: void initializeGL() override { initializeOpenGLFunctions(); glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // 创建并绑定纹理 glGenTextures(1, &m_texture); glBindTexture(GL_TEXTURE_2D, m_texture); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); } void resizeGL(int w, int h) override { glViewport(0, 0, w, h); } void paintGL() override { // 从VideoCapture对象中读取图像数据 makeCurrent(); // 设置当前OpenGL上下文 // 从VideoCapture对象中读取图像数据 // 将图像数据上传到纹理中 if (!m_image.empty()) { glBindTexture(GL_TEXTURE_2D, m_texture); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, m_image.cols, m_image.rows, 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, m_image.data); } // 清除帧缓冲区 glClear(GL_COLOR_BUFFER_BIT); // 渲染纹理 if (!m_image.empty()) { glEnable(GL_TEXTURE_2D); glBegin(GL_QUADS); glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, -1.0f, 0.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, -1.0f, 0.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, 1.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 0.0f); glEnd(); glDisable(GL_TEXTURE_2D); } } private: cv::Mat m_image; GLuint m_texture{}; }; glClear(GL_COLOR_BUFFER_BIT);此处崩溃,分析原因并修改
根据代码分析,glClear(GL_COLOR_BUFFER_BIT)在paintGL()函数中被调用,可能是因为OpenGL上下文没有被正确地设置导致程序崩溃。为了避免程序崩溃,可以在调用glClear(GL_COLOR_BUFFER_BIT)之前添加makeCurrent()函数来确保OpenGL上下文被正确地设置。修改后的代码如下:
```
void paintGL() override {
makeCurrent(); // 设置当前OpenGL上下文
// 从VideoCapture对象中读取图像数据
// 将图像数据上传到纹理中
if (!m_image.empty()) {
glBindTexture(GL_TEXTURE_2D, m_texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, m_image.cols, m_image.rows, 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, m_image.data);
}
// 清除帧缓冲区
makeCurrent(); // 再次设置当前OpenGL上下文
glClear(GL_COLOR_BUFFER_BIT);
// 渲染纹理
if (!m_image.empty()) {
glEnable(GL_TEXTURE_2D);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, -1.0f, 0.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, -1.0f, 0.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, 1.0f, 0.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 0.0f);
glEnd();
glDisable(GL_TEXTURE_2D);
}
}
```