在OpenGL中绘制2D纹理

用户名

我有一个名为的绘画函数,DrawImage但确实令人困惑,并且只能使用特定形式的重塑函数,因此我有两个问题:

  1. 如何在OpenGL中绘制纹理?我只想创建一个获取纹理,x,y,宽度,高度甚至角度的函数,然后根据参数将其绘制并绘制。我想定期将其绘制为GL_QUAD,但现在不知道该怎么做.-。人们说我应该使用SDL或SFML这样做,建议吗?如果是,您能给我一个简单的功能来加载纹理并绘制纹理吗?我目前正在使用SOIL加载纹理。

功能如下:

void DrawImage(char filename, int xx, int yy, int ww, int hh, int angle) 
{
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, filename);

  glLoadIdentity();
  glTranslatef(xx,yy,0.0);
  glRotatef(angle,0.0,0.0,1.0);
  glTranslatef(-xx,-yy,0.0);

// Draw a textured quad
glBegin(GL_QUADS);
glTexCoord2f(0, 0); glVertex2f(xx,yy);
glTexCoord2f(0, 1); glVertex2f(xx,yy + hh);
glTexCoord2f(1, 1); glVertex2f(xx + ww,yy + hh);
glTexCoord2f(1, 0); glVertex2f(xx + ww,yy);

glDisable(GL_TEXTURE_2D);
glPopMatrix();

glMatrixMode(GL_PROJECTION);
glPopMatrix();

glMatrixMode(GL_MODELVIEW);
glEnd();
}

有人对我说你不能打电话glDisableglPopMatrix或者glMatrixModeglBegin之间glEnd问题是-没有它,代码将无法工作。任何想法,如果没有它怎么办?2.关于glutReshapeFunc,文档说它得到了一个指向具有2个args(宽度和高度)的函数的指针-我创建了(到目前为止)一个无效的函数-任何想法如何编写一个获得宽度和高度的reshape函数高度,实际上完成了重塑所需要做的工作。

还有一个小问题:在OpenGL之类的GUI方面,C ++比C有什么优势?就像我所看到的,只有OOP才是问题,而我没有解决OOP可以解决而C不能解决的任何问题(在OpenGL中)。

无需回答所有问题-问题1对我来说基本上是最重要的:P

jozxyqk
  1. 您的DrawImage函数看起来非常好。虽然是的,但是您不应该致电glMatrixMode等,glEnd因此请删除它们。我认为问题只是与设置投影矩阵有关,而添加的调用恰好解决了最初不应该存在的问题。glutReshapeFunc用于捕获窗口调整大小事件,因此在您需要它之前不必使用它。

  2. SDL使您可以更好地控制事件和过剩,但设置时间会更长一些。GLFW也是一个很好的选择。我想除非您看到所需的功能,否则更改并不是那么重要。这些是创建GL上下文并进行一些事件处理的库。土壤可以全部用于它们。

  3. OpenGL是图形API,并且提供了用于执行硬件加速3D图形的通用接口,而不是GUI库。虽然有为OpenGL编写的GUI库。

  4. 是的,我相信许多人会将OOP发挥到极致。我喜欢C ++一词作为更好的C语言,而不是完全重组您的编码方式。也许只是继续使用C,而是使用C ++编译器。然后,当您看到喜欢的功能时,请使用它。最终,您可能会发现自己正在使用很多东西,然后对它们存在的原因以及何时使用它们有了更好的理解,而不是盲目地遵循编码实践。只是imo,这都是非常主观的。

所以,投影矩阵...

要在2D屏幕上以3D方式绘制内容,您可以将3D点“投影”到平面上。我确定您已经看过这样的图像:

在此处输入图片说明

这使您可以定义任意的3D坐标系。除了以2D方式绘制东西外,自然要直接使用像素坐标。毕竟,这就是您要监视的内容。因此,您要使用一种旁路投影,该投影不进行任何透视缩放,而是按比例和长宽比匹配像素。

默认投影(或“查看体积”)是正射-1到一个立方体。要改变它,

glMatrixMode(GL_PROJECTION); //from now on all glOrtho, glTranslate etc affect projection
glOrtho(0, widthInPixels, 0, heightInPixels, -1, 1);
glMatrixMode(GL_MODELVIEW); //good to leave in edit-modelview mode

确实可以在任何地方调用此函数,但是由于唯一影响变量的是窗口的宽度/高度,因此通常将其放入一些初始化代码中,或者如果您打算调整窗口的大小,则可以使用调整大小的事件处理程序,例如:

void reshape(int x, int y) {... do stuff with x/y ...}
...
glutReshapeFunc(reshape); //give glut the callback

这将使屏幕的左下角的原点和传递的值glVertex现在可以以像素为单位。

还有两件事:不是glTranslatef(-xx,-yy,0.0);您只能在glVertex2f(0,0)之后使用Push / pop矩阵应始终在函数中配对,这样就不会期望调用方将其匹配。

我将以一个完整的例子结束:

#include <GL/glut.h>
#include <GL/gl.h>
#include <stdio.h>

int main(int argc, char** argv)
{
    //create GL context
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGBA);
    glutInitWindowSize(800, 600);
    glutCreateWindow("windowname");

    //create test checker image
    unsigned char texDat[64];
    for (int i = 0; i < 64; ++i)
        texDat[i] = ((i + (i / 8)) % 2) * 128 + 127;

    //upload to GPU texture
    GLuint tex;
    glGenTextures(1, &tex);
    glBindTexture(GL_TEXTURE_2D, tex);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 8, 8, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, texDat);
    glBindTexture(GL_TEXTURE_2D, 0);

    //match projection to window resolution (could be in reshape callback)
    glMatrixMode(GL_PROJECTION);
    glOrtho(0, 800, 0, 600, -1, 1);
    glMatrixMode(GL_MODELVIEW);

    //clear and draw quad with texture (could be in display callback)
    glClear(GL_COLOR_BUFFER_BIT);
    glBindTexture(GL_TEXTURE_2D, tex);
    glEnable(GL_TEXTURE_2D);
    glBegin(GL_QUADS);
    glTexCoord2i(0, 0); glVertex2i(100, 100);
    glTexCoord2i(0, 1); glVertex2i(100, 500);
    glTexCoord2i(1, 1); glVertex2i(500, 500);
    glTexCoord2i(1, 0); glVertex2i(500, 100);
    glEnd();
    glDisable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, 0);
    glFlush(); //don't need this with GLUT_DOUBLE and glutSwapBuffers

    getchar(); //pause so you can see what just happened
    //System("pause"); //I think this works on windows

    return 0;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在OpenGL中绘制多个2D纹理

来自分类Dev

在OpenGL中绘制2D Quad

来自分类Dev

从数据到OpenGL 2D纹理

来自分类Dev

在openGL中绘制2D多边形

来自分类Dev

opengl 2d游戏只绘制第二个精灵纹理而不是第一个

来自分类Dev

Qt / OpenGL尝试显示2D纹理

来自分类Dev

OpenGL 2D纹理无法正确显示C ++

来自分类Dev

openGL 2D 视差滚动纹理撕裂/接缝

来自分类Dev

opengl:glGetTexImage用于2d纹理和1d纹理数组混淆

来自分类Dev

在C中的opengl中绘制纹理

来自分类Dev

计算在OpenGL中按1d,2d,3d分组创建的纹理

来自分类Dev

(2d纹理阵列)vs(纹理图集)vs(多次绑定/绘制)

来自分类Dev

使用lwjgl在现代OpenGL中绘制纹理

来自分类Dev

如何在 OpenGL 中重新定位绑定到帧缓冲区的 2D 纹理?

来自分类Dev

Java OpenGL 绘制纹理

来自分类Dev

OpenGL:绘制2D图像的最快方法

来自分类Dev

使用OpenGL矩阵转换将纹理从“ 1D”映射到“ 2D”

来自分类Dev

在Matlab中绘制2D网格

来自分类Dev

在matplotlib中绘制2D函数

来自分类Dev

在Excel中绘制2D图形

来自分类Dev

C#WinForm-SharpDX.Toolkit.Graphics绘制2D纹理

来自分类Dev

OpenGL-无法读取/写入2D深度纹理数组

来自分类Dev

使用OpenGL在2D梯形中进行纹理的投影插值

来自分类Dev

从顶点计算2D形状的纹理坐标?iOS OpenGL ES

来自分类Dev

使用OpenGL在2D梯形中进行纹理的投影插值

来自分类Dev

OpenGL纹理2d阵列深度> 1时无法渲染

来自分类Dev

iOS SDL2 OpenGL ES无法绘制纹理

来自分类Dev

在openGl android(Wear)中绘制基于图像的纹理

来自分类Dev

通过 VBO 绘制时在 Tao.OpenGL 中的纹理