2015-01-15 2 views
0

쉐이더에 부호없는 정수의 1D 텍스처를로드하려고합니다. 텍스처의 각 요소는 1 또는 0 일뿐입니다 (이 작업을 수행해야합니다).이 값은 사용자가 내 앱의 UI에서 수행하는 선택에 따라 다릅니다. 나는이 명백하게 쉬운 문제점에 절대적으로 찔린 다, 나는 잘못하고있는 것을 얻을 수 없다. 이 내 OpenGL을 코드 :조각 쉐이더에서 부호없는 정수를 샘플링

glGenTextures(1, &m_inside_texture_id); 
vtkgl::ActiveTexture(vtkgl::TEXTURE16); 
glBindTexture(GL_TEXTURE_1D, m_inside_texture_id); 

glTexImage1D(GL_TEXTURE_1D,0,vtkgl::R8UI,insideVector.size(), 
     0,vtkgl::R8UI,GL_UNSIGNED_BYTE, &insideVector[0]); 
glBindTexture(GL_TEXTURE_1D, m_inside_texture_id); 
glTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, vtkgl::CLAMP_TO_EDGE); 

glBindTexture(GL_TEXTURE_1D, 0); 

그리고 이것은 내가 그 질감을 가져 오기 위해 사용하고있는 GLSL 코드 :

#version 120 
#extension GL_EXT_gpu_shader4 : enable 

uniform usampler1D insideVector; 

uint inside2 = texture1D(insideVector, indexInVector).a; 

if (inside2 == 0) 
{ 
    gl_FragColor = shade(vec4(1.0, 0.0, 0.0, 1.0)); 
} 
else if (inside2 == 1) 
{ 
    gl_FragColor = shade(vec4(0.0, 1.0, 0.0, 1.0)); 
} 

insideVector이 GLubytes의 벡터이다. indexInVector는 사용자가 변경 될 때마다 증가하는 정규화되지 않은 부호없는 정수입니다 (각 시간 : insideVector.push_back (1) 또는 insideVector.push_back (0) 및 indexInVector = insideVector.size (- (1/255))

컴파일되지만 inner2 변수를 사용하려고하면 충돌이 발생합니다. 내가 사용하는 OpenGL 버전은 많은 확장 기능을 가진 2.1입니다. 미리 감사드립니다.

편집 : 가 균일 var에 insideVector는 다음과 같이 설정됩니다

vtkUniformVariables *v; 
ivalue = 16; 
v->SetUniformi("insideVector", 1, &ivalue); 

이 문제는 쉐이더에 있었다 해결했다. inside2는 부호없는 정수이므로 부호있는 정수 (0 및 1) 대신 부호없는 정수 (0u 및 1u)와 비교해야합니다. 당신은 또한

uint inside2 = texture1D(insideVector, indexInVector).r; 

uint inside2 = texture1D(insideVector, indexInVector).a; 

를 교체해야 셰이더에 있도록

+0

1. 이것은 C++ 문제가 아닙니다. 태그를 제거하십시오. 2. uniform var을 쉐이더에 설정하는 코드는 보이지 않습니다. 텍스처를 균일하게 설정해야합니다. 전체 코드를 작성하십시오. –

+0

안녕하세요 @ PankajBansal, 나는 서명되지 않은 정수 대신 서명되지 않은 정규화 된 데이터 형식으로 실행되는 동일한 코드를 가졌으므로 문제는 부호없는 정수로 작업하는 것입니다. – pedroddm

+0

@PankajBansal : 확실히 C++과 같은 질문입니다. 분명히 Java 또는 C#이 아닙니다. 주소 연산자를 사용하기 때문이며 이름 공간을 사용하기 때문에 C가 아닙니다. 언어 태그는 OpenGL 질문에서 매우 중요합니다. 각 언어마다 고유 한 바인딩이 있기 때문입니다. 포인터를 사용하는 C 및 C++ 바인딩의 내용은 포인터 데이터 유형이 부족하여 Java 또는 C#에서 완전히 다른 기능 시그니처를 가질 수 있습니다. –

답변

1

충돌하지만 "R8UI"에서 "R"에 확률이 무관은 glTexImage1D 호출이 잘못된 것 같다, 빨간색 의미 : format 매개 변수는 GL_RED_INTEGER 여야합니다. GL_R8UI는 내부 형식입니다.

+0

이 경우 올바른 형식 매개 변수는'GL_RED_INTEGER'가 아니라'GL_RED'입니다. –

+0

@ reto-koradi 그것을 지적 해 주셔서 감사합니다. 답장을 편집했습니다. – Shadocko

관련 문제