简体   繁体   English

OpenGL 2d纹理渲染问题

[英]OpenGL 2d texture render issue

I am trying to load and draw a 2d texture using OpenGL with GLFW and SOIL. 我正在尝试使用带有GLFW和SOIL的OpenGL加载和绘制2d纹理。 I have this code, but I only get one solid color (which seems to come from the texture). 我有这段代码,但是我只有一种纯色(似乎来自纹理)。

I have tested whether the .png loads with an example that came with SOIL, and it worked fine so there has to be some issue in my code. 我已经测试了.png是否加载了SOIL附带的示例,并且该示例工作正常,因此我的代码中必然存在一些问题。

This is my code: 这是我的代码:

#include <cstdio>

#include "GL/glfw.h"
#include "SOIL.h"

// function declarations
void drawscene();
void idlefunc();
void updatedisplay();

// global data
GLuint texture; // our example texture

int main(int argc, char **argv) {
    if (!glfwInit()) {
        fprintf(stderr, "Failed to initialize GLFW\n");
        return 1;
    }

    if (!glfwOpenWindow(640, 480, 0, 0, 0, 0, 16, 0, GLFW_WINDOW)) {
        fprintf(stderr, "Failed to open GLFW window\n");
        return 1;
    }

    // enable vsync (if available)
    glfwSwapInterval(1);

    // load textures
    texture = SOIL_load_OGL_texture(
        "tex.png",
        SOIL_LOAD_AUTO,
        SOIL_CREATE_NEW_ID,
        SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_MIPMAPS | SOIL_FLAG_DDS_LOAD_DIRECT
    );

    // check for an error during the texture loading
    if (!texture) {
        printf("SOIL loading error: '%s'\n", SOIL_last_result());
    }

    while (glfwGetWindowParam(GLFW_OPENED)) {
        idlefunc();
    }

    // if we get here something went wrong
    return 0;
}

// this function gets called every frame
void idlefunc() {
    updatedisplay();
    drawscene();
}

// set up te display
void updatedisplay() {
    int screen_width, screen_height;
    glfwGetWindowSize(&screen_width, &screen_height);

    if (screen_height <= 0) screen_height = 1;
    if (screen_width <= 0) screen_width = 1;

    glViewport(0, 0, screen_width, screen_height);

    glClearColor(0.02f, 0.02f, 0.02f, 0.0f);
    glClear(GL_COLOR_BUFFER_BIT);

    glEnable(GL_TEXTURE_2D);
    glDisable(GL_DEPTH_TEST);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0.0, screen_width, screen_height, 0.0, 0.0, 1.0);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    // displacement trick for exact pixelization
    glTranslatef(0.375f, 0.375f, 0.0f);
}

// draw the scene in this function
void drawscene() {
    glBindTexture(GL_TEXTURE_2D, texture);
    glPushMatrix();
        glTranslatef(10.0f, 10.0f, 0);
        glBegin(GL_QUADS);
            glTexCoord2f(0.0f, 0.0f);
            glVertex2f(0.0f, 0.0f);
            glTexCoord2f(0.0f, 128.0f);
            glVertex2f(0.0f, 128.0f);
            glTexCoord2f(128.0f, 128.0f);
            glVertex2f(128.0f, 128.0f);
            glTexCoord2f(128.0f, 0.0f);
            glVertex2f(128.0f, 0.0f);
        glEnd();
    glPopMatrix();

    glfwSwapBuffers();
}

Found the issue (thanks to user786653). 找到了问题(感谢user786653)。 No matter the vertex coords, the tex coords are between 0.0 and 1.0. 无论顶点坐标如何,顶点坐标都在0.0到1.0之间。 This is the fixed code: 这是固定的代码:

// draw the scene in this function
void drawscene() {
    glBindTexture(GL_TEXTURE_2D, texture);
    glPushMatrix();
        glTranslatef(10.0f, 10.0f, 0);
        glBegin(GL_QUADS);
            glTexCoord2f(0.0f, 0.0f);
            glVertex2f(0.0f, 0.0f);
            glTexCoord2f(0.0f, 1.0f);
            glVertex2f(0.0f, 128.0f);
            glTexCoord2f(1.0f, 1.0f);
            glVertex2f(128.0f, 128.0f);
            glTexCoord2f(1.0f, 0.0f);
            glVertex2f(128.0f, 0.0f);
        glEnd();
    glPopMatrix();

    glfwSwapBuffers();
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM