2017-04-06 177 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