2017-11-05 6 views
0

텍스처에 익숙해지기 위해 개념 증명 프로그램을 쓰고 있지만, 1x1 텍스처에서는 작동하지만 다른 모든 텍스처에서는 실패한다는 점에서 이상하게 작동합니다. 여러 번 프로그램을 스캔하고 각 함수의 인수를 살펴 보았지만 왜 1x1 텍스처 (또는 큰 텍스처의 첫 번째 픽셀)에서는 제대로 작동하는지 이해할 수 없지만 그렇지 않은 경우에는 흰색 사각형을 보여줍니다.OpenGL -이 프로그램을 1x1보다 큰 텍스처에서 사용할 수있게하려면 어떻게해야합니까?

다음은 glTexImage2D의 너비와 높이 인수 (1, 1)과 (2,2)로 실행되는 동일한 프로그램의 그림입니다. texture width, height -> 2,2

texture width, height -> 1,1

는 (2 × 2 빨강, 녹색, 파랑, 노랑 행 주요 질감을 그릴 것으로 예상하는 반면) 흰색 사각형을 표시하는 코드입니다.

참고 : in(Comment, Arg) 매크로가 Arg에 equivelent되고, 그것은 단지 당신의 머리 위로 떨어져 glTexImage2D의 인수를 기억하는 까다로운 때문에이 특정 프로그램에 사용됩니다. 내가 in(height, 1)in(width, 1)in(height, 2)in(width, 2)을 변경하는 경우

#include <GL/glut.h> 

// | reminder decorator macro. 
#define in(Comment, Arg) Arg 

GLubyte bm[16] = { 
    0xff, 0x00, 0x00, 0xff, 
    0x00, 0xff, 0x00, 0xff, 
    0x00, 0x00, 0xff, 0xff, 
    0xff, 0xff, 0x00, 0xff 
}; 

GLuint tex; 

void display() 
{ 
    glClear(GL_COLOR_BUFFER_BIT);   

    glBindTexture(GL_TEXTURE_2D, tex); 

    glLoadIdentity(); 

    // | make the square smaller to contrast our target from the background. 
    glScalef(.5f, .5f, 1.f); 

    glBegin(GL_TRIANGLE_FAN); 
     glTexCoord2f(0.f, 0.f); 
     glVertex2f(-1.f, 1.f); 
     glTexCoord2f(0.f, 1.f); 
     glVertex2f(1.f, 1.f); 
     glTexCoord2f(1.f, 1.f); 
     glVertex2f(1.f, -1.f); 
     glTexCoord2f(1.f, 0.f); 
     glVertex2f(-1.f, -1.f); 
    glEnd(); 

    glFlush(); 
} 

int main(int argc, char **argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_SINGLE); 
    glutCreateWindow(""); 

    glEnable(GL_TEXTURE_2D);   
    glGenTextures(1, &tex); 
    glBindTexture(GL_TEXTURE_2D, tex); 
    glTexImage2D (
     in(target, GL_TEXTURE_2D), 
     in(level, 0), 
     in(internalFormat, GL_RGBA), 
     in(width, 2), 
     in(height, 2), 
     in(border, 0), 
     in(format, GL_RGBA), 
     in(type, GL_UNSIGNED_BYTE), 
     in(data, bm) 
    ); 
    glTexParameteri(tex, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    glTexParameteri(tex, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 

    glutDisplayFunc(display); 
    glutMainLoop(); 

    return 0; 
} 

, 그것은 빨간색 사각형을 보여 주며, 예상대로 bm 배열의 첫 번째 세 값을 변경, 그것은 큐브에이 색상을 매핑합니다.

#include <GL/glut.h> 

// | reminder decorator macro. 
#define in(Comment, Arg) Arg 

GLubyte bm[16] = { 
    0xff, 0x00, 0x00, 0xff, 
    0x00, 0xff, 0x00, 0xff, 
    0x00, 0x00, 0xff, 0xff, 
    0xff, 0xff, 0x00, 0xff 
}; 

GLuint tex; 

void display() 
{ 
    glClear(GL_COLOR_BUFFER_BIT);   

    glBindTexture(GL_TEXTURE_2D, tex); 

    glLoadIdentity(); 

    // | make the square smaller to contrast our target from the background. 
    glScalef(.5f, .5f, 1.f); 

    glBegin(GL_TRIANGLE_FAN); 
     glTexCoord2f(0.f, 0.f); 
     glVertex2f(-1.f, 1.f); 
     glTexCoord2f(0.f, 1.f); 
     glVertex2f(1.f, 1.f); 
     glTexCoord2f(1.f, 1.f); 
     glVertex2f(1.f, -1.f); 
     glTexCoord2f(1.f, 0.f); 
     glVertex2f(-1.f, -1.f); 
    glEnd(); 

    glFlush(); 
} 

int main(int argc, char **argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_SINGLE); 
    glutCreateWindow(""); 

    glEnable(GL_TEXTURE_2D);   
    glGenTextures(1, &tex); 
    glBindTexture(GL_TEXTURE_2D, tex); 
    glTexImage2D (
     in(target, GL_TEXTURE_2D), 
     in(level, 0), 
     in(internalFormat, GL_RGBA), 
     in(width, 1), 
     in(height, 1), 
     in(border, 0), 
     in(format, GL_RGBA), 
     in(type, GL_UNSIGNED_BYTE), 
     in(data, bm) 
    ); 
    glTexParameteri(tex, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    glTexParameteri(tex, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 

    glutDisplayFunc(display); 
    glutMainLoop(); 

    return 0; 
} 

누군가 무슨 일이 일어 났는지 설명하고이 문제를 해결할 수 있습니까?

솔루션 : 대신 GL_TEXTURE_2D의 glTexParameteri에 전달 텍스 (보조 노트 : 및 오타 1.1 glVertex2f에 1.F합니다)

#include <GL/glut.h> 

// | reminder decorator macro. 
#define in(Comment, Arg) Arg 

GLubyte bm[16] = { 
    0xff, 0x00, 0x00, 0xff, 
    0x00, 0xff, 0x00, 0xff, 
    0x00, 0x00, 0xff, 0xff, 
    0xff, 0xff, 0x00, 0xff 
}; 

GLuint tex; 

void display() 
{ 
    glClear(GL_COLOR_BUFFER_BIT);   

    glBindTexture(GL_TEXTURE_2D, tex); 

    glLoadIdentity(); 

    // | make the square smaller to contrast our target from the background. 
    glScalef(.5f, .5f, 1.f); 

    glBegin(GL_TRIANGLE_FAN); 
     glTexCoord2f(0.f, 0.f); 
     glVertex2f(-1.f, 1.f); 
     glTexCoord2f(1.f, 0.f); 
     glVertex2f(1.f, 1.f); 
     glTexCoord2f(1.f, 1.f); 
     glVertex2f(1.f, -1.f); 
     glTexCoord2f(0.f, 1.f); 
     glVertex2f(-1.f, -1.f); 
    glEnd(); 

    glFlush(); 
} 

int main(int argc, char **argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_SINGLE); 
    glutCreateWindow(""); 

    glEnable(GL_TEXTURE_2D);   
    glGenTextures(1, &tex); 
    glBindTexture(GL_TEXTURE_2D, tex); 
    glTexImage2D (
     in(target, GL_TEXTURE_2D), 
     in(level, 0), 
     in(internalFormat, GL_RGBA), 
     in(width, 2), 
     in(height, 2), 
     in(border, 0), 
     in(format, GL_RGBA), 
     in(type, GL_UNSIGNED_BYTE), 
     in(data, bm) 
    ); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 

    glutDisplayFunc(display); 
    glutMainLoop(); 

    return 0; 
} 

solved

답변

3

당신이를 지정 2x2 텍스처의 경우 텍스처가 밉맵 완성이 아니지만 밉 매핑 축소 필터를 사용합니다. 결과는 사양에 따라 올바른 결과를 얻을 수 있습니다.

glTexParameteri(tex, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 

glTexParameterGL_TEXTURE_2D 아닌 텍스처 이름을 것 텍스처 바인딩 포인트를, 예상 :

귀하의 실수는 비 밉 매핑 GL_NEAREST 필터를 설정하려면 시도에있다. 결과적으로이 호출은 GL_INVALID_ENUM 오류를 생성하며 다른 효과는 없습니다.

+0

GL_TEXTURE_MIN_FILTER를 (를) 설정하기위한 올바른 속성은 무엇입니까? 게다가, GL_TEXTURE_MAG_FILTER가이 경우에 걱정해야만하는 것은 아니겠습니까? 확대되고 최소화되지 않았기 때문에요? – Dmitry

+0

이 값을 설정하는 것이 아니라 첫 번째 인수'target'이 잘못되었습니다. – derhass

+0

derp이면 GL_TEXTURE_2D입니다. 그것은 그것을 해결합니다. – Dmitry

관련 문제