쉐이더에 부호없는 정수의 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;
를 교체해야 셰이더에 있도록
1. 이것은 C++ 문제가 아닙니다. 태그를 제거하십시오. 2. uniform var을 쉐이더에 설정하는 코드는 보이지 않습니다. 텍스처를 균일하게 설정해야합니다. 전체 코드를 작성하십시오. –
안녕하세요 @ PankajBansal, 나는 서명되지 않은 정수 대신 서명되지 않은 정규화 된 데이터 형식으로 실행되는 동일한 코드를 가졌으므로 문제는 부호없는 정수로 작업하는 것입니다. – pedroddm
@PankajBansal : 확실히 C++과 같은 질문입니다. 분명히 Java 또는 C#이 아닙니다. 주소 연산자를 사용하기 때문이며 이름 공간을 사용하기 때문에 C가 아닙니다. 언어 태그는 OpenGL 질문에서 매우 중요합니다. 각 언어마다 고유 한 바인딩이 있기 때문입니다. 포인터를 사용하는 C 및 C++ 바인딩의 내용은 포인터 데이터 유형이 부족하여 Java 또는 C#에서 완전히 다른 기능 시그니처를 가질 수 있습니다. –