在OpenGL中绘制多个2D纹理

天哪

我正在使用Visual Studio 2013 Ultimate用C ++编写自己的游戏库。我已经设法获得一些适用于1种纹理的基本图形,但是当我添加另一种图形时,它似乎会“覆盖”先前的纹理。

例如,如果我有纹理A和纹理B,则B会在应有的A处绘制我已检查每个纹理是否使用了相同的纹理ID。

我看过OpenGL,尝试绘制多个2d纹理,只有第1个出现,但这不能解决我的问题。

我对OpenGL和较低级别的图形编程非常陌生,有人可以向我解释我的代码有什么问题吗?


这是我的纹理加载代码:

Texture::Texture(const std::string& filePath)
{
    m_pixelData = PixelData(stbi_load(filePath.c_str(),
                                      &m_size.x,
                                      &m_size.y,
                                      &m_numberOfImageComponents,
                                      0 /* number of requested image components if non-zero */));

    // generate 1 texture name and store it in m_textureName
    glGenTextures(1, &m_textureID);

    // make this the active texture
    glBindTexture(GL_TEXTURE_2D, m_textureID);

    // specifies how the data to be uploaded is aligned
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

    // set texture parameters (need to look up the details of what's going on here)
    // TODO work out what this does
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

    // TODO work out what this does
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

    GLenum imageFormat;

    // Work out image format
    // TODO add proper error handling
    switch(m_numberOfImageComponents)
    {
    case 4:
        imageFormat = GL_RGBA;
        break;
    case 3:
        imageFormat = GL_RGB;
        break;
    default:
        DDGL_LOG(ERROR, "No image formats with " + std::to_string(m_numberOfImageComponents) + "components known");
        throw;
    }

    // upload the texture to VRAM
    glTexImage2D(GL_TEXTURE_2D,
                0,
                imageFormat,
                m_size.x,
                m_size.y,
                0,
                imageFormat,
                GL_UNSIGNED_BYTE,
                m_pixelData.get());
}

这是我的“开始抽奖”代码

void GraphicsAPIWrapper::startDraw()
{
    // TODO does this need to be called every frame?
    glMatrixMode(GL_PROJECTION); // select the matrix
    glLoadIdentity(); //reset the matrix

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}

这是我的绘图代码

void GraphicsAPIWrapper::draw(std::shared_ptr<IDrawableGameObject> drawableObject)
{
        glPushMatrix();

        // convert pixel coordinates to decimals
        const Vector2F floatWindowSize          ((float) getWindowSize().x,                             (float) getWindowSize().y);
        const Vector2F floatObjectSize          ((float) drawableObject->getSize().x,                   (float) drawableObject->getSize().y);
        const Vector2F relativeObjectSize       (floatObjectSize.x / floatWindowSize.x,                 floatObjectSize.y / floatWindowSize.y);
        const Vector2F relativeObjectPosition   (drawableObject->getPosition().x / floatWindowSize.x,   drawableObject->getPosition().y / floatWindowSize.y);

        // transformations
        glTranslatef(relativeObjectPosition.x, relativeObjectPosition.y, 0.0f);
        glRotatef(drawableObject->getRotation(), 0.0f, 0.0f, 1.0f);

        // TODO should this be triangles or quads? I've been told triangles are generally higher performance
        // right now QUADS are simpler though
        glBegin(GL_QUADS);

        glBindTexture(GL_TEXTURE_2D, drawableObject->getTextureID());

        glTexCoord2f(0.0f, 1.0f); glVertex3f(-relativeObjectSize.x, -relativeObjectSize.y,  1.0f);
        glTexCoord2f(1.0f, 1.0f); glVertex3f(relativeObjectSize.x,  -relativeObjectSize.y,  1.0f);
        glTexCoord2f(1.0f, 0.0f); glVertex3f(relativeObjectSize.x,  relativeObjectSize.y,   1.0f);
        glTexCoord2f(0.0f, 0.0f); glVertex3f(-relativeObjectSize.x, relativeObjectSize.y,   1.0f);

        glEnd();

        glPopMatrix();
}

这是我的“结束抽奖”代码

void GraphicsAPIWrapper::endDraw()
{
    glfwSwapBuffers(m_window->getWindow());
}

因此,非常清楚地说,我得到的行为是一种纹理在各处绘制,而不是所需的不同纹理。

您正在-BlockglBindTexture()内部进行调用glBegin/glEnd,该块是无效的,除了会产生错误之外没有其他作用。因此,真正绑定的对象是在此之前的最后一个绑定-很有可能是在加载纹理时进行的绑定操作,因此最后加载的对象是为所有对象显示的绑定操作...

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在OpenGL中绘制2D纹理

来自分类Dev

在OpenGL中绘制2D Quad

来自分类Dev

从数据到OpenGL 2D纹理

来自分类Dev

在openGL中绘制2D多边形

来自分类Dev

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

来自分类Dev

OpenGL ES 2.0绘制多个纹理

来自分类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

使用Matplotlib在3D中绘制多个2D曲线

来自分类Dev

使用Matplotlib在3D中绘制多个2D曲线

来自分类Dev

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

来自分类Dev

在Matlab中绘制2D网格

来自分类Dev

在matplotlib中绘制2D函数

来自分类Dev

在Excel中绘制2D图形

来自分类Dev

如何在Matlab中以堆栈样式绘制多个2D图像?

来自分类Dev

如何在Matlab中以堆栈样式绘制多个2D图像?

来自分类Dev

在OpenGL中绘制多个形状

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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