2009-02-27 6 views
0

OSG에서 텍스처 처리를 완전히 비활성화해야합니다. 나는 glDisable(GL_TEXTURE_2D)을 시도하고 또한 osg :: stateSet을 사용했지만 텍스처가있는 일부 노드는 여전히 텍스처를 렌더링합니다. 텍스처를 전역 적으로 끌 수있는 방법이 있습니까?OpenSceneGraph에서 텍스처 사용 안 함

배경 비트 : 장면에 대한 객체 범위 맵을 생성해야합니다. 즉, 보이는 각 픽셀을 생성 한 객체를 아는 것입니다. 나는 평평한 색으로 각 객체를 렌더링하고 컬러 버퍼를 다시 읽습니다. 이것이 텍스쳐 링이 내가하려는 일을 해치는 이유입니다. 이 작업을 수행하는 방법에 대한 다른 아이디어가 있습니까?

답변

0

OSG 메일 링리스트에 질문을 게시 해 보셨습니까? 그것은 훨씬 더 적절한 물어볼 곳 같아 보입니다.

1

Texture2D 속성을 설정할 때 osg :: StateAttribute :: OVERRIDE 비트를 설정했는지 확인 했습니까? ss 텍스처가있을 수 있습니다 모든 것을 포괄하는 장면 그래프에서 최대 충분히 높은 노드에서 stateset입니다

osg::Texture2D*const tex2D = new osg::Texture2D; 
ss->setAttributeAndModes(tex2D, osg::StateAttribute::OFF | osg::StateAttribute::OVERRIDE); 

같은 즉, 뭔가.

물론 GL_TEXTURE_2D 모드 나 Texture2D 속성의 하위에 osg :: StateAttribute :: PROTECTED 비트가 설정된 경우 OVERRIDE는 무시되지만 그럴 수 없다는 것을 알고있는 위치에있을 수 있습니다.

0

osgViewer :: Viewer (단일/기본 뷰어) 또는 osgViewer :: View를 사용하고 있습니까? 't'키는 osgGA :: StateSetManipulator가 addEventHandler()로 추가 된 경우 텍스처를 토글합니다.

결국 호출되는 것은 입니다. void StateSetManipulator :: setTextureEnabled (bool newtexture). 는 그것이 무엇 것은 :

unsigned int mode = osg::StateAttribute::OVERRIDE|osg::StateAttribute::OFF; 
for(unsigned int ii=0; ii < 4; ii++) 
{ 
    _stateset->setTextureMode(ii, GL_TEXTURE_1D, mode); 
    _stateset->setTextureMode(ii, GL_TEXTURE_2D, mode); 
    _stateset->setTextureMode(ii, GL_TEXTURE_3D, mode); 
    _stateset->setTextureMode(ii, GL_TEXTURE_RECTANGLE, mode); 
    _stateset->setTextureMode(ii, GL_TEXTURE_CUBE_MAP, mode); 
} 

경우 * _stateset * 인까지 높은 노드 (루트 노드는 뷰어로 설정 예 /보기 -> setSceneData())

1

문제가 발생하는 이유 특정 노드가 osg :: StateAttribute :: OVERRIDE를 사용하는 것일 수도 있습니다. Troubadour (올바르게)와 같이해야한다고 생각합니다. 이 경우, 실제로 전체 트리를 가로 지르고 텍스처 렌더링을 차단하는 노드 방문객을 만들 수 있습니다. 매우 자연스럽지 만 작동 할 것입니다.

질문의 두 번째 부분 : 한 가지 옵션은 OSG의 이미 내장 된 함수를 사용하여 눈에서부터 화면의 각 픽셀까지 광선을 투영하고 교차하는 위치를 확인하는 것입니다. 매우 느리고, 하지만 확실하게 작동 할 것입니다 :) OpenGL 선택 모드가 있습니다. (사용법이 너무 복잡하기 때문에 직접 사용해 본적이 없습니다.) 여기에서 http://www.opengl.org/resources/faq/technical/selection.htm을 읽을 수 있습니다.