2017-04-06 15 views
-1

私はglew 1.1.0、SDL_image 2.0、mingw(Code :: Blocks、Windows)を使用しています。私はSDL_Imageを使って.pngファイルをインポートしようとしており、それをテクスチャにして、OpenGLを使って画面に表示しようとしています。私がプログラムを実行すると、純粋な白い四角形が表示されます。インポートしようとしているイメージの幅と高さは同じですが、純粋な白です。私は約30分まっすぐにコードを見て、コードは正常に見え、それは私にエラーを与えることはなかった "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

あなたはinternalFormatとして4を渡しているので、あなたはinvalid valueを取得しています。合格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); 

これについての奇妙な部分は、私は私の古いノートパソコン

それはあなたの古いラップトップに取り組んだ理由に動作するようになったあるドライバーが巧妙されていたためです。

それはまだ代わりに自分をwを設定し、hの、あなたが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

関連する問題