OpenGL和SDL_Image纹理问题

时间:2017-04-06 20:51:35

标签: opengl mingw sdl glew sdl-image

我正在使用glew 1.1.0,SDL_image 2.0和mingw(Code :: Blocks,Windows)。我正在尝试使用SDL_Image导入.png文件,并使其成为纹理并显示在我使用OpenGL的屏幕上。当我运行该程序时,它显示一个纯白色方块,它具有相同的宽度和高度的图像我试图导入,但它是纯白色。我查看代码大约30分钟,代码看起来很好,它从来没有给我任何错误execpt“错误初始化OpenGL!无效值”。

我的main.cpp:

#include <GL/glew.h>
#include <SDL.h>
#include <GL/gl.h>
#include <GL/glu.h>

#include <iostream>
#include <stdio.h>
#include <SDL_image.h>
#include <SDL_opengl.h>

using namespace std;

void init();
void Render();

bool ex;
bool akey;


SDL_Event e;
SDL_Window *win = NULL;
GLuint txID;

int x, y, w, h;

int main(int argc, char* args[])
{
init();

while(!ex)
{
    while(SDL_PollEvent(&e) != 0)
    {
        if(e.type == SDL_QUIT)
        {
            ex = true;
        }
       Render();
    }
}
}

void init()
{


SDL_Init(SDL_INIT_VIDEO);

SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 4);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 0);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);

win = SDL_CreateWindow("Demo", SDL_WINDOWPOS_CENTERED,               SDL_WINDOWPOS_CENTERED, 640, 480, SDL_WINDOW_OPENGL);


SDL_GLContext cont = SDL_GL_CreateContext(win);
SDL_GL_SetSwapInterval(1);
glewInit();

glClear( GL_COLOR_BUFFER_BIT );
glViewport( 0.f, 0.f, 640, 480);

glMatrixMode( GL_PROJECTION );
glLoadIdentity();

glOrtho( 0.0, 640, 480, 0.0, 1.0, -1.0 );

  glMatrixMode( GL_MODELVIEW );
glLoadIdentity();

  glClearColor( 0.f, 0.f, 0.f, 1.f );

glEnable( GL_TEXTURE_2D );
glEnable(GL_BLEND);
SDL_Surface *sur = IMG_Load("ef.png");
w = 40;
h = 60;


glGenTextures( 1, &txID );
glBindTexture(GL_TEXTURE_2D, txID);
glTexImage2D(GL_TEXTURE_2D, 0, 4, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, sur->pixels);
GLenum error = glGetError();

if( error != GL_NO_ERROR )
{
    printf( "Error initializing OpenGL! %s\n", gluErrorString( error ) );

}
//Set texture parameters
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );

//Unbind texture
glBindTexture(GL_TEXTURE_2D, NULL);

}


void Render()
{
glClear( GL_COLOR_BUFFER_BIT );

glLoadIdentity();
glTranslatef(20, 20, 0);
glBindTexture(GL_TEXTURE_2D, txID);

glBegin( GL_QUADS );
    glTexCoord2f( 0.f, 0.f ); glVertex2f(0.f, 0.f);
    glTexCoord2f( 1.f, 0.f ); glVertex2f(w, 0.f);
    glTexCoord2f( 1.f, 1.f ); glVertex2f(w, h);
    glTexCoord2f( 0.f, 1.f ); glVertex2f(0.f, h);
glEnd();


SDL_GL_SwapWindow(win);


}

这是我正在尝试加载的图片:

程序和错误,正如您可以看到白框是图像所在的位置。

1 个答案:

答案 0 :(得分:0)

您收到invalid value,因为您将4作为internalFormat传递。传递4代表GL_TRIANGLES,这不是有效的格式。

Check the documentation for valid formats.

你可能打算通过GL_RGBA

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, sur->pixels);
  

关于这一点的最奇怪的部分是我在我的旧笔记本电脑上工作

它在旧笔记本电脑上工作的原因是因为司机很聪明。

  

它仍然给我相同的错误,仍然呈现纯白色方块

首先,您不必自己设置wh,而是可以从SDL_Surface获取它们。

SDL_Surface *sur = IMG_Load("someimage.jpg");

GLuint txID = 0;
glGenTextures(1, &txID);
glBindTexture(GL_TEXTURE_2D, txID);

int mode = GL_RGB;
if(sur->format->BytesPerPixel == 4)
    mode = GL_RGBA;

glTexImage2D(GL_TEXTURE_2D, 0, mode, sur->w, sur->h, 0, mode, GL_UNSIGNED_BYTE, sur->pixels);

我现在注意到你的目标是OpenGL 4.0。因此,invalid value也可能是由于您尝试使用固定功能管道,同时具有OpenGL 4.0上下文。

虽然我建议远离固定功能管道。尝试请求OpenGL 2.0上下文,看看是否能解决问题。

SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 0);