2017-04-06 164 views
-1

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

我的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); 


} 

这是我试图加载图像:

程序和错误,因为你可以看到白色的盒子图像应该在哪里。

回答

0

你得到一个invalid value,因为你传递4internalFormat。通过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); 
+0

它仍然给我同样的错误,仍然呈现一个纯白色的正方形。关于这个最奇怪的部分是我在旧笔记本电脑上工作,而现在在这个新的桌面上它不会工作。 – BlindSide78

+0

看看我的编辑。 – Vallentin

+0

@ BlindSide78是否有效? – Vallentin