다른 질감을 추가하는 방법을 볼 수없는 이유는 게시 한 코드에 중요한 기능 두 개 (glGenTextures
및 glBindTexture
)가 누락 되었기 때문입니다. 첫 번째는 OpenGL 컨텍스트에서 텍스처 객체를 생성합니다 (그래픽 하드웨어에 텍스처가있는 위치). 두 번째 함수는 후속 호출 (glTex ..)에 영향을주는 텍스처 객체 중 하나를 "선택"합니다.
우선 glTexParameteri 및 glTexImage2D와 같은 함수는 모든 렌더링 루프에서 다시 호출 할 필요가 없습니다. 그러나 이미지가 항상 변경되기 때문에 작업을 수행해야합니다. 기본적으로 코드에서 사용되는 텍스처 객체는 0 번째 객체 (기본값의 예약 된 객체)입니다. 두 개의 텍스처 오브젝트를 생성하고 원하는 결과를 얻기 위해 하나씩 바인딩해야합니다.
GLuint tex_obj[2]; //create two names for the texture (should not be global variables, but just for sake of this example).
void initGL() {
glClearColor (0.0,0.0,0.0,1.0);
glDisable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0,width,height,0);
glEnable(GL_TEXTURE_2D);
glGenTextures(2,tex_obj); //generate 2 texture objects with names tex_obj[0] and [1]
glBindTexture(GL_TEXTURE_2D, tex_obj[0]); //bind the first texture
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); //set its parameters
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glBindTexture(GL_TEXTURE_2D, tex_obj[1]); //bind the second texture
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); //set its parameters
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
}
void paintGL() {
glClear (GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glBindTexture(GL_TEXTURE_2D,tex_obj[0]); //bind the first texture.
//then load it into the graphics hardware:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width0, height0, 0, GL_RGB, GL_UNSIGNED_BYTE, the_image_data0);
glBegin(GL_QUADS);
glTexCoord2i(0,0); glVertex2i(0,height); //you should probably change these vertices.
glTexCoord2i(0,1); glVertex2i(0,0);
glTexCoord2i(1,1); glVertex2i(width,0);
glTexCoord2i(1,0); glVertex2i(width,height);
glEnd();
glBindTexture(GL_TEXTURE_2D, tex_obj[1]); //bind the second texture.
//then load it into the graphics hardware:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width1, height1, 0, GL_RGB, GL_UNSIGNED_BYTE, the_image_data1);
glBegin(GL_QUADS);
glTexCoord2i(0,0); glVertex2i(0,height); //you should probably change these vertices.
glTexCoord2i(0,1); glVertex2i(0,0);
glTexCoord2i(1,1); glVertex2i(width,0);
glTexCoord2i(1,0); glVertex2i(width,height);
glEnd();
}
기본적으로 어떻게 수행됩니까? 그러나 OpenGL에 대한 지식은 약간 구식이므로 약간 더 효율적인 방법이있을 수 있다고 경고해야합니다 (적어도 glBegin/glEnd는 C++에서 사용되지 않으며 VBO로 대체되었습니다).
가 작동하지 않습니다 페인트 호출을 기억 - 나는 gluOrtho2D을 할 필요가 (0, 폭, 높이, 0); 모든 페인트에서 또는 아무 것도 나타나지 않습니다 - 그리고 그것은 내가 먼저하는 glTexImage2D() 중 하나만 칠해줍니다. 특정 glTexImage2D()를 텍스처 ID와 연관시키는 것은 무엇입니까? –
좋아, 나는 멍청이야 - 두 번째 이미지가 틀렸어 (시작과 끝 너비는 같았어!) Quads가 있었지만 모든 호출마다 gluOrtho2D (전체 창 코드)를 수행해야한다. –
텍스처가 만들어지면, glTexSubImage2D를 사용하여 데이터를 업데이트하십시오. 매번 전체 재 초기화를 수행하는 glTexImage보다 훨씬 빠릅니다. 실제로 glTexImage의 data 매개 변수에 NULL을 전달하여 나중에 glTexSubImage를 통해 데이터를 초기화 한 다음 제공하려는 경우에만 사용할 수 있습니다. – datenwolf