2017-04-06 17 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); 


} 

: 당신이 흰색 상자가 볼 수

프로그램 및 오류, 이미지가 있어야합니다. 당신이 internalFormat4을 통과하고 있기 때문에

답변

0

당신은 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); 

이에 대한 이상한 부분은, 난 내 오래된 노트북

는 기존의 노트북에 근무하는 이유에 일을 가지고있는 드라이버가 영리되고 되었기 때문이다. 그것은 아직도 여전히 날 같은 오류를 제공하고

이 순수한 흰색 사각형에게 대신 자신을 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