2010-07-14 6 views
0

임의의 매우 테셀레이션 된 객체 (STL 임포트)의 Z 축을 따라 음영 처리 된 간단한 그라데이션을 추가하려고합니다.OpenGL : GL_TEXTURE_1D trouble

대부분 효과가 있지만 질감이 Z와 평행하지 않지만 회전 및 크기가 다르게되어있는 이상한 얼굴이 있습니다. 이면들은 대개 (항상) 항상 수직으로 향하고 일부는 상당히 큽니다. 나는 수직면을 적용하는 것이 가장 쉽다고 생각할 것이다. 그래서 나는 현재 난감하다. 여기

는 초기화이다 :

glEnable(GL_TEXTURE_1D); 
foreach(const STLTriangle& t, _model.triangles()) 
{ 
    glBegin(GL_TRIANGLES); 
    glNormal3f(t.normal[0], t.normal[1], t.normal[2]); 
    glTexCoord1f(fmod(t.v[0][2],1.0)); glVertex3f(t.v[0][0],t.v[0][1],t.v[0][2]); 
    glTexCoord1f(fmod(t.v[1][2],1.0)); glVertex3f(t.v[1][0],t.v[1][1],t.v[1][2]); 
    glTexCoord1f(fmod(t.v[2][2],1.0)); glVertex3f(t.v[2][0],t.v[2][1],t.v[2][2]); 
    glEnd(); 
} 
glDisable(GL_TEXTURE_1D); 

사람이 어떻게 이것에 대해 갈거야 잘못 무언가를보고 있습니까 :

glBindTexture(GL_TEXTURE_1D, _d->textures[0]); 
glTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); //GL_DECAL); 
glTexImage1D(GL_TEXTURE_1D, 0, GL_RGB, _d->sideImage.width(), 0, 
    GL_BGRA_EXT, GL_UNSIGNED_BYTE, _d->sideImage.bits()); 

그리고 사용

?

+1

"나는 정말 이상한 얼굴을 가지고 있습니다."스크린 샷, 기쁘게 생각합니다. "fmod (t.v [0] [2], 1.0)"아마 필요하지 않습니다. – SigTerm

+0

글쎄, GL_REPEAT은 내가하지 않는다는 것을 의미한다고 생각했을 것이다. 그러나 fmod()를 생략하면 Z 축을 따라 텍스쳐가 정말로 이상하게 선형 스케일링된다. 아마도 거기에 단서가 있지만, 1am에 그것을 볼 수 없었습니다. :) – darron

답변

2

좋아, 해결했습니다. fmod()는 단서였습니다.

대신에 :

glTexCoord1f((t.v[0][2] - bounds.min[2])/range); 

내가 스케일링을 적용 (정말, 또는 0 textureScaleFactor * 1) :

glTexCoord1f(t.v[0][2]); 

나는 0에서 1의 일부를 따라 Z를 정상화하는 데 필요한 factor는 범위으로 원하는 텍스처 밀도를 얻을 수 있습니다.

fmod()은 정말 잘못되었습니다. 면에 최소 점과 최대 점 0과 1이 있으면 전체 텍스처를 얻을 수 있습니다. 그러나 0과 1.1을 얻으면 0.1이되고 얼굴 전체의 텍스처의 10 분의 1이됩니다. 죄송합니다. 나는 그것이 다른 많은 얼굴들에서 효과가 있다는 것에 놀랐다. 그게 내가 휴식을 취하지 않고 잠을 자지 않는 것에 대한 것입니다. :)

적어도 어느 시점에서 (fmod()이 제거됨) 적어도 필자는 잘못된 것보다 더 많은 잘못된 것처럼 보이는 앨리어싱 효과를 얻고있었습니다. 그래서 텍스처를 밉맵으로 전환했습니다. 에서 :

glTexImage1D(GL_TEXTURE_1D, 0, GL_RGB, _d->sideImage.width(), 0, 
    GL_BGRA_EXT, GL_UNSIGNED_BYTE, _d->sideImage.bits()); 

사람 : 비록이와

gluBuild1DMipmaps(GL_TEXTURE_1D, GL_RGB, _d->sideImage.width(), GL_BGRA_EXT, 
    GL_UNSIGNED_BYTE, _d->sideImage.bits()); 

, 여전히 거리에서 별명입니다. 그걸 처리하는 방법에 대한 제안? 나는 밉맵 레벨을 가지고 놀고 그것이 저를 잡는 곳을 볼 것입니다 ...

+2

MIN 필터를 밉맵 필터로 변경 했습니까? –

+0

아, 그게 다예요. 나는 아직도 OpenGL에서 초보자이다. 고마워, 고마워. – darron