【问题标题】:Why does my OpenGL texture appear white?为什么我的 OpenGL 纹理显示为白色?
【发布时间】:2015-07-19 11:37:28
【问题描述】:

我正在尝试获取 OpenGL 纹理以在屏幕上以 2D 形式呈现。我知道这看起来很简单,但我是 OpenGL 新手,这给我带来了一些麻烦。

无论我尝试什么,它都显示为白色。

我已经看到了像OpenGL renders texture all white 这样的其他问题,并检查了清单上的所有内容,但我似乎无法弄清楚来源,我非常感谢任何帮助。

我很确定我只是在某个地方犯了一些愚蠢的错误,并尝试废弃我的代码并重写了几次。

这是与从 main 方法运行的窗口相关的代码。

//Window is a custom wrapper for GLFWwindow
Window thirdwindow(window_width, window_height, "Three");
thirdwindow.show();
thirdwindow.setPosition(300, 300);

ThirdLoop(thirdwindow);

这里是第三循环:

static void ThirdLoop(Window& win)
{
    GLuint tex = loadBMP("cat.bmp");
    auto size = win.getWindowSize();
    win.beginDraw();
    while (running)
    {
        if (win.isClosing())
            running = false;

        glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // Set background color to black and opaque
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);         // Clear the color buffer (background)

        DrawImage(size, tex);
        win.render();

        Update();
    }
}

还有 DrawImage(对于这里奇怪的缩进表示歉意,复制粘贴的东西)

void DrawImage(const Size<int>& size, GLuint texture) {
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho(0.0, size.width, 0.0, size.height, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();

glLoadIdentity();
glDisable(GL_LIGHTING);

glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture);

// Draw a textured quad
glBegin(GL_QUADS);
glTexCoord2f(0, 0); glVertex3f(0, 0, 0);
glTexCoord2f(0, 1); glVertex3f(0, 100, 0);
glTexCoord2f(1, 1); glVertex3f(100, 100, 0);
glTexCoord2f(1, 0); glVertex3f(100, 0, 0);
glEnd();

glDisable(GL_TEXTURE_2D);
glPopMatrix();

glMatrixMode(GL_PROJECTION);
glPopMatrix();

glMatrixMode(GL_MODELVIEW);
}

loadBMP 取自 http://www.opengl-tutorial.org/beginners-tutorials/tutorial-5-a-textured-cube/

【问题讨论】:

  • 您是否尝试过通过 GPU 调试器运行它?如果您使用的是 AMD 卡,则类似于 GPU Perf Studio;我认为 NVIDIA 也有类似的东西。

标签: c++ opengl graphics 2d textures


【解决方案1】:

你可以试试这个:

unsigned int CreateTexture(unsigned int Width, unsigned int Height, unsigned char* Pixels)
{
    unsigned int ID = 0;
    glGenTextures(1, &ID);
    glBindTexture(GL_TEXTURE_2D, ID);
    glPixelStorei(GL_UNPACK_ROW_LENGTH, Width);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, Width, Height, 0, GL_BGRA, GL_UNSIGNED_BYTE, Pixels);
    glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
    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_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    return ID;
}

void DestroyTexture(unsigned int ID)
{
    glDeleteTextures(1, &ID);
}

void DrawTexture(unsigned int ID, float X1, float Y1)
{
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, ID);
    glColor4ub(0xFF, 0xFF, 0xFF, 0xFF);
    glBegin(GL_QUADS);
    glTexCoord2f(0.0f, 1.0f);
    glVertex2f(X1, Y1);
    glTexCoord2f(0.0f, 0.0f);
    glVertex2f(X1, Y2);
    glTexCoord2f(1.0f, 0.0f);
    glVertex2f(X2, Y2);
    glTexCoord2f(1.0f, 1.0f);
    glVertex2f(X2, Y1);
    glEnd();
    glDisable(GL_TEXTURE_2D);
}

我对窗口使用以下设置:

static float angle = 0.0f;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

int w = 800;
int h = 600;
glOrtho(0.0f, w, h, 0.0f, 0.0f, -1.0f);

glMatrixMode(GL_MODELVIEW);
glShadeModel(GL_SMOOTH);
glClearColor(0.0f, 40.0f / 256.0f, 100.0f / 256.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearDepth(1.0f);

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);


glPushMatrix();
glTranslatef(400, 300, 0);
glScalef(100, 100, 0);
glRotatef(angle, 0.0f, 0.0f, 1.0f);

if (TextureID == 0)
{
    TextureID = CreateTexture(Width, Height, Pixels); //I used the ImageLoader from the comments that I posted.
}
DrawTexture(TextureID, 0.0f, 0.0f);

glPopMatrix();
++angle;

SwapBuffers(DC);
Sleep(1);

【讨论】:

  • 谢谢,但它仍然显示为白色。
  • 无论您传递什么,因为像素可能不正确或格式与 BGRA 不匹配。该站点上的位图加载功能不会搜索像素偏移量。它也不处理 24 位格式。
  • 尝试加载位图:stackoverflow.com/questions/20595340/… 它不处理 24 位位图,但至少它会寻找像素的正确偏移量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多