Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL 2d纹理渲染问题_C++_Opengl - Fatal编程技术网

C++ OpenGL 2d纹理渲染问题

C++ OpenGL 2d纹理渲染问题,c++,opengl,C++,Opengl,我试图加载和绘制一个二维纹理使用OpenGL与GLFW和土壤。我有这个代码,但我只得到一种纯色(似乎来自纹理) 我已经用SOIL附带的一个示例测试了.png是否加载,它工作得很好,所以我的代码中一定存在一些问题 这是我的代码: #include <cstdio> #include "GL/glfw.h" #include "SOIL.h" // function declarations void drawscene(); void idlefunc(); void update

我试图加载和绘制一个二维纹理使用OpenGL与GLFW和土壤。我有这个代码,但我只得到一种纯色(似乎来自纹理)

我已经用SOIL附带的一个示例测试了.png是否加载,它工作得很好,所以我的代码中一定存在一些问题

这是我的代码:

#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();
}
#包括
#包括“GL/glfw.h”
#包括“土壤h”
//函数声明
void drawsecene();
void idlefunc();
void updatedisplay();
//全球数据
胶合纹理;//我们的示例纹理
int main(int argc,字符**argv){
如果(!glfwInit()){
fprintf(stderr,“未能初始化GLFW\n”);
返回1;
}
如果(!glfwOpenWindow(640、480、0、0、0、16、0、GLFW_窗口)){
fprintf(stderr,“无法打开GLFW窗口\n”);
返回1;
}
//启用vsync(如果可用)
glfwSwapInterval(1);
//加载纹理
纹理=土壤\u负载\u OGL\u纹理(
“tex.png”,
土壤负荷自动控制,
土壤\u创建\u新的\u ID,
土壤标志两个的功率土壤标志MIPMAPS土壤标志直接负载
);
//在纹理加载过程中检查错误
如果(!纹理){
printf(“土壤加载错误:'%s'\n',土壤上次结果());
}
while(glfwGetWindowParam(GLFW_打开)){
idlefunc();
}
//如果我们到了这里,就会出问题
返回0;
}
//此函数每帧调用一次
void idlefunc(){
updatedisplay();
drawscene();
}
//设置te显示
void updatedisplay(){
int屏幕宽度、屏幕高度;
GLFWGetWindowsSize(屏幕宽度和屏幕高度);
如果(screen_height发现问题(感谢用户786653)。无论顶点坐标如何,tex坐标都在0.0和1.0之间。这是固定代码:

// 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();
}
发现问题(感谢用户786653)。无论顶点坐标如何,tex坐标都在0.0和1.0之间。这是固定代码:

// 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();
}

可能不是(唯一)原因,但纹理坐标通常在0..1范围内给出。你是指
glTexCoord2f
?我真的很想用像素坐标来表示四边形的位置/大小。非常简单(我不熟悉你使用的库,所以我可能不在这里):OpenGL主要在0..1坐标下工作,这很方便,因此您不必担心您的纹理是256x256还是512x512,或者屏幕是HD还是SD,但这意味着您必须自己跟踪大小,并在关注像素时适当缩放。可能不是(唯一)原因是,但纹理坐标通常在0..1范围内给出,你是说仅是
glTexCoord2f
?我真的很想使用像素坐标作为四边形的位置/大小。非常简单(我不熟悉你使用的库,所以我可能不在这里):OpenGL主要在0..1坐标下工作,这很方便,因此您不必担心纹理是256x256还是512x512,或者屏幕是HD还是SD,但这意味着您必须自己跟踪大小,并在关注像素时进行适当缩放。