2011-12-02 3 views
0

먼저 ppm 파일을 읽으려고 시도했지만 텍스처에 사용하려고했지만 문제가 (파일 읽기에서) 어디에 있는지는 확실하지 않았습니다. 그래서 작은 4x4 이미지 (임의의 색상)를 하드 코딩하여 사용했습니다. 나는 아직도 그것을 작동시킬 수 없다. 누구든지 어떤 통찰력을 가지고 있습니까?OpenGL에서 밉맵 텍스처링

data2, x2, y2는 모두 하드 코딩 된 이미지 속성입니다.

glPushMatrix(); 

    FILE *inFile; 
    char dump[3]; 
    int max, k = 0; 

    inFile = fopen("mountains.ppm", "r"); 
    int x; 
    int y; 

     fscanf(inFile, "%s", dump); 
     //printf("%s", dump); 
     fscanf(inFile, "%d %d", &x, &y); 


     fscanf(inFile, "%d", &max); 
     int arraySize = y*(3*x); 
     int data[arraySize]; 

     for (int i = 0; i < x; i++) { 
      for (int j = 0; j < y; j++) { 
       fscanf(inFile, "%d", &data[k++]); 
       fscanf(inFile, "%d", &data[k++]); 
       fscanf(inFile, "%d", &data[k++]); 
      } 
     } 

    int data2[] = { 100 , 50, 50, 40, 30, 70, 70, 30, 40, 155, 50, 215, 
        50 , 40, 30, 60, 15, 77, 70, 70, 70, 70, 70, 70, 
        50 , 40, 30, 20, 110, 210, 20, 15, 47, 40, 40, 30, 
        15 , 40, 15, 40, 30, 40, 30, 20, 80, 80, 40, 20}; 

    int x2 = 4; 
    int y2 = 4; 


    fclose(inFile); 

     glGenTextures(1,&texture); 
     glBindTexture(GL_TEXTURE_2D,texture); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);   

     gluBuild2DMipmaps(GL_TEXTURE_2D,3,x2,y2,GL_RGB,GL_UNSIGNED_BYTE,data2); 

    glEnable(GL_TEXTURE_2D); 
    glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE); 
    glBindTexture(GL_TEXTURE_2D,texture); 

    glTexCoord2d(0,0); glVertex3f(0,0.0,0); 
    glTexCoord2d(0,1); glVertex3f(0,0.0,80); 
    glTexCoord2d(1,1); glVertex3f(80,0.0,80); 
    glTexCoord2d(1,0); glVertex3f(80,0.0,0); 
    glDisable(GL_TEXTURE_2D); 

glPopMatrix(); 
+1

당신이 얻은 행동에 대한 설명을 주시겠습니까? 그것은 untextured 쿼드를 표시합니까, 전혀 아무것도 표시되지 않습니다? 또한,이 코드 섹션 밖에서 행렬 조작이 있습니까? 쿼드가 보이지 않는 것처럼 보이는 것 같습니다. – nonVirtualThunk

+1

"아직 작동하지 않습니다"라는 말은 ...? – genpfault

+0

죄송합니다. 아무 것도 나타나지 않을 것을 의미했습니다. 그리고 저는 예견과 모든 것을 설정했습니다. 나는 모든 코드를 여기에 포함하면 코드가 길어질 것이라고 느꼈다. 나는 중요한 부분일지도 모른다고 생각했다. – jaiesh

답변

5

첫째, 텍스처 로딩은 모든 프레임을 일을해야 일이 아니다. 텍스처를 한 번 만든 다음 해당 텍스처로 렌더링해야 할 때 사용합니다. 따라서 렌더링 로직에서 텍스처 로딩 코드를 가져와야합니다.

다음 :

gluBuild2DMipmaps(GL_TEXTURE_2D,3,x2,y2,GL_RGB,GL_UNSIGNED_BYTE,data2); 

data2은 일반적으로 크기가 4 바이트 인 int 배열이다. 그러나 OpenGL에게 데이터의 3 바이트마다 픽셀이라고 가정합니다. 첫 번째 바이트는 빨간색이고 두 번째 바이트는 녹색입니다. 그러나 빨간색 값은 4 바이트입니다. 따라서 OpenGL은 데이터를 올바르게 가져 오지 못합니다.

data2int 어레이가 아닌 GLubyte 어레이로 정의하는 것이 좋습니다.

(두 번째 매개 변수)의 숫자는으로 사용하지 마십시오. 사양에 그것이 합법이라고 말하는 것은 상관하지 않습니다. 그냥 실제 형식을 사용하십시오. "3"대신 GL_RGB8을 사용하십시오.

마지막 :

glTexCoord2d(0,0); glVertex3f(0,0.0,0); 
glTexCoord2d(0,1); glVertex3f(0,0.0,80); 
glTexCoord2d(1,1); glVertex3f(80,0.0,80); 
glTexCoord2d(1,0); glVertex3f(80,0.0,0); 

이 꽤 많이하지 아무것도. 주위에 glBegin()/glEnd()이 없으면 몇 가지 상태 값을 설정하는 것입니다. 실제로 어떤 쌍이 아닌 glVertex* 명령을 호출하면 정의되지 않은 동작이 발생합니다. 확실히 렌더링을 가져 오지 않습니다. (또는 그렇게해도 유용하지는 않습니다).

항상 작업 코드로 시작하면 생산성이 향상됩니다. 예를 들어, 텍스처를 가지고 놀고 싶다면, 알고있는 것을 시작하면됩니다 : untextured shape를 그리십시오. 일단 그 일을하면, 어떤 것이 깨지는 경우, 그것은 텍스처링 코드 때문일 것입니다.

+0

많은 감사합니다. 나는 글루 바이트 (glByte)에 대해 몰랐고 glBegin/End를 포함하지 않는 것은 내 부분에 어리 석음이었다. 또한 매번 렌더링하지도 않고 실제로 표시 목록에 있습니다. 텍스처로드에 적합할까요? 이미지가 올바르게 표시되었습니다. – jaiesh

+0

죄송합니다. 빠른 질문입니다. fscanf()를 사용하여 GluByte를 읽으려면 어떻게해야합니까?fgets()를 대신 사용하겠습니까? – jaiesh