2013-07-22 5 views
2

이전에 게임을 개발 중이었고 약간의 문제가있었습니다! 나는 하나의 이미지로 게임을 시작했다. 각 텍스처에는 자체 파일이 있습니다. 그것은 내가 그랬던 바보가 얼마인지를 깨닫고 모든 텍스처를 포함하고있는 하나의 그림으로 바꾸려고했습니다 (어쨌든 그들은 아주 작습니다). 이제 문제가 생겼습니다. 원래 텍스처 (10 x 10)보다 큰 이미지가로드되면 거의 가장 가까운 이웃 사이징 알고리즘으로 표시되지 않는 것처럼 보입니다. 내가 얻는 것은 희미한 이미지입니다. 또한 뒤집 혔습니다 ... 왜 이런 문제가 발생합니까?OpenGL 텍스처가 거꾸로되어 흐리게 렌더링됩니다.

아래 코드와 이미지.

텍스트 및 기호가 포함 된 스프라이트 시트를 처음 보여주는 첫 번째 사례입니다. (아주 작습니다, 100 x 100) http://imgur.com/HU5zEAO.jpg

이것은 프로그램을 실행할 때 얻는 것입니다. 여기 http://i.imgur.com/HeVPdPy.jpg

지금 여기 MAIN.CPP 파일

#include <GL/glew.h> 
#include <GL/glut.h> 

#include "spritesheet_class.h" 
#include "load_img.h" 

GLuint TextSheet; 
Spritesheet Test; 

void LoadFiles() 
{ 

    GLuint TextSheet = LoadTexture("davetica.png", 100, 100, 0); 

    Test.SetTex(TextSheet, 100, 100, 10, 10); 

} 

void Reshape(int width, int height) 
{ 

    glViewport(0, 0, (GLsizei)width, (GLsizei)height); 
    glMatrixMode(GL_PROJECTION); 

    glLoadIdentity(); 
    glOrtho(0.0f, width, 0.0f, height, 1.0f, 100.0f); 

    glMatrixMode(GL_MODELVIEW); 

} 

void Display() 
{ 

    glClear(GL_COLOR_BUFFER_BIT); 
    glLoadIdentity(); 

    glTranslatef(0.0f, 0.0f, -1.0f); 

    Test.DrawSprite(1, 0, 0, 400, 400); 

    glutSwapBuffers(); 

} 

int main(int argc, char **argv) 
{ 

    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_DOUBLE); 

    glutInitWindowPosition(200, 100); 
    glutInitWindowSize(512, 512); 

    glutCreateWindow("Sprite Sheets"); 

    glutDisplayFunc(Display); 
    glutIdleFunc(Display); 
    glutReshapeFunc(Reshape); 

    LoadFiles(); 

    glutMainLoop(); 

} 

이다 나는 Spritesheet 클래스를 작성하는 클래스의 헤더입니다. 이 필요한 경우

#ifndef SPRITESHEET_CLASS_H_INCLUDED 
#define SPRITESHEET_CLASS_H_INCLUDED 

#include "load_img.h" 

class Spritesheet 
{ 

    public: 
     void SetTex(GLuint Tex, int ImgW, int ImgH, int HorzAm, int VertAm); 

     void DrawSprite(int spriteNum, int xLoc, int yLoc, int width, int height); 

    private: 
     GLuint Texture; 
     int imageWidth, imageHeight, horiAm, vertAm; 

}; 

void Spritesheet::SetTex(GLuint Tex, int ImgW, int ImgH, int HorzAm, int VertAm) 
{ 

    imageWidth = ImgW; 
    imageHeight = ImgH; 
    horiAm = HorzAm; 
    vertAm = VertAm; 

    Texture = Tex; 

} 

void Spritesheet::DrawSprite(int spriteNum, int xLoc, int yLoc, int width, int height) 
{ 

    glEnable(GL_TEXTURE_2D); 

    glBindTexture(GL_TEXTURE_2D, Texture); 

    glBegin(GL_QUADS); 

     glTexCoord2f(1.0f, 0.0f); 
     glVertex2f(xLoc, yLoc); 

     glTexCoord2f(1.0f, 1.0f); 
     glVertex2f(xLoc, yLoc+height); 

     glTexCoord2f(0.0f, 1.0f); 
     glVertex2f(xLoc+width, yLoc+height); 

     glTexCoord2f(0.0f, 0.0f); 
     glVertex2f(xLoc+width, yLoc); 

    glEnd(); 

    glDisable(GL_TEXTURE_2D); 

} 

#endif // SPRITESHEET_CLASS_H_INCLUDED 

마지막으로, 여기에 내가 텍스처를로드하고 서식을 사용하는 LoadImage 함수를 처리하는 파일입니다.

편집 : 문제를 발견했습니다. 내 이미지는 2의 제곱이 아니므로 올바르게 표시되지 않았습니다.

+0

며칠 전에이 문제가있었습니다. 말 그대로 이미지를 거꾸로 뒤집어서 문제를 해결했지만 실제로 왜 그런 일이 일어 났는지 알고 싶습니다. – hasherr

+0

그래, 그 길로 가고 싶었어. 그러나 그것은 정직한 haha ​​인 것이 조금 거칠게 보인다. – DavidBittner

답변

7
  • 올바른 방향으로 뒤집지 않았기 때문에 이미지가 뒤집 혔습니다. 그것은 동음새처럼 들리지만, OpenGL의 좌표계는 텍스처를 위로 아래로 매핑합니다. 여기서 (0,0)은 왼쪽 하단에, (1,1)은 오른쪽 상단에 있습니다. 이 문제를 해결하는 것은 교과서 유형의 운동입니다.

  • gl* 전화가 수정중인 텍스쳐를 알게하려면 (즉, 텍스쳐를 활성화하십시오) glActiveTexture(GL_TEXTURE0)으로 전화해야합니다. 초기 값은 GL_TEXTURE0이지만 여전히 잠재적 인 문제로 끝나지 않도록하기 위해 계속 넣었습니다.

  • 나는 그것이 여러분의 질문의 일부가 아니라는 것을 알고 있지만, 7 년간 사용되지 않는 OpenGL 코드를 사용하고 있습니다. 일반적인 제안으로서 프로그래머블 파이프 라인으로 전환해야합니다. Here's a link to ogldev을 최신 OpenGL의 기초로 사용하거나 적어도 일부는 4.0 이상입니다. 일부는 3에 있지만 셰이더는 FFP보다 낫습니다. Here's another short few from Swiftless. 기본적으로 OpenGL 4.0 이상을 검색하면 Google에서 안내해드립니다. 가파른 학습 곡선이지만 가치가 있습니다.

+0

마지막으로, 더 자세히 설명해 주시겠습니까? 내가 사용하고있는 것은 오래된 것일 수도 있다는 것을 깨달았지만 좋은 시작 튜토리얼을 찾은 유일한 방법은 정직합니다. 어쩌면 올바른 방향으로 어떤 조언을 해줄 수 있습니까? 고마워요! – DavidBittner

+0

올드 덧글,하지만 그뿐만 아니라 검색 할 수 있습니다, 다음 웹 사이트는 가장 현대적인 OpenGL 튜토리얼을 내가 본 바 없음 : https://learnopengl.com, 이것을 읽은 후에, 현대 OpenGL은 훨씬 쉽게 보인다 분명히 더 강력 해지는 데 사용하십시오. –

2

나는 오직 필요한 블록이 거꾸로되는 것을 방지하기 위해 이성을 상실 할 수있는 DDS (DXT) 파일로이 발생했습니다. 코드에서이 작업을 수행해야했지만 대안은 단순히 이미지 프로그램에서 이미지를 뒤집는 것입니다.

OpenGL에서 PNG 파일을 사용하지 않았지만 PNG를 사용했던 마지막 시간은 얼마 전 XNA와 같았습니다. Flipping OpenGL texture 그것은 다른 언어입니다하지만 모두 같은 문제를 갖고있는 것 같다 :

내가 여기를 발견했다.

은 또한이 기능을 조사하고

stbi_load(filename, &w, &h, &n, 4); 

어느 쪽이든의 데이터를 뒤집기 할 수 있는지, 또는 당신은 너 자신을하거나 PNG 이미지를 가져 오는 다른 뭔가를 사용해야 할 것입니다.

나는 glMatrixMode (GL_TEXTURE)를 사용하여 렌더링하는 동안 행렬을 뒤집을 수 있다는 제안을 보았습니다. 그러나 이것은 당신이하고 싶은 것이 아니라고 생각합니다.

행운을 비네.

관련 문제