2016-07-25 2 views
1

GLSL에서 간단한 비트 맵 글꼴을 렌더링하는 쉐이더 프로그램을 만들고 있습니다.균일 int [8] 영역의 내용은 항상 0입니까?

프로그래밍 환경이 C#이므로 OpenTK를 사용하여 OpenGL 4.0을 캡슐화했지만 구문은 C 및 C++의 모든 예제와 매우 유사합니다.

제 문제는 조각 쉐이더에 정수 배열을 전달하려고 시도하지만, 할 때마다 모든 배열 요소가 0이됩니다. 정수는 0에서 255 사이의 범위 여야하며 값을 보내기 전후에 값을 확인했습니다. 화를 내고있어.

int[] ints = new int[] { 33, 34, 35, 36, 37, 38, 39, 40 }; 
GL.UseProgram(programLocation); 
GL.Uniform1(arrayLocation, ints.Length, ints); 

내 조각 쉐이더가 배열을하고 결정하는 기능 몇 가지를 사용

현재 나는 다음 지침을 사용하여 쉐이더에 INT [] 배열을 보낼 시도, 내 프로그램을 결합하고있어 쿼드의 어느 부분에 어떤 문자를 배치 할 것인가. 나는 정적 인 숫자와 배열을 가지고이 함수들을 테스트 해왔다. 나는 셰이더에서 수동으로 빌드하고, 그들이 기대했던대로 작동한다. 의

uniform int characters[8]; 
.... 
gl_FragColor = texture2D(bitmapFontTex, GetBitmapFontStart(characters[0...8etc])); 

나머지 : - 간단하게 위의 구문은 실제로 데이터를 전송 끝나지 않는 몇 가지 이유를 들어 모든 요소 내 쉐이더에서 0

에 배열이 표시되며, 다음과 같이 사용 평가 내 코드는 독립적으로 테스트 될 때 작동하는 것처럼 보입니다. 함께 제공 될 때만 떨어져 버리고 위의 코드 블록은 함께 제공됩니다. 어리석은 루키 실수를 한 적이 있었나요? 어떤 도움이라도 대단히 감사합니다.

답변

2

잘못된 버전을 사용 중입니다. glUniform*() 1D 정수 배열을 전송하는 데 사용하려는 값은 glUniform1iv()입니다.

float의 경우 i은 int이고 f은 유의하십시오. 숫자는 요소의 수를 나타냅니다. 배열 접미어 v의 경우 숫자가 치수를 나타냅니다. 여기

GL.Uniform1iv(arrayLocation, ints.Length, ints); 

불행하게도이 그렇지 않은 https://www.opengl.org/sdk/docs/man/docbook4/xhtml/glUniform.xml

+0

참조 에 대한 링크입니다. Uniform1iv는 OpenTK에 존재하지 않습니다. 메소드 오버로드에서 GL.Uniform1에 번들됩니다. http://i.imgur.com/GFIk6OD.png – user2312610

+0

네가 맞다면, OpenTK는 그것들을'Uniform1()'에 묶는다. @ user2312610 배열 위치가 맞는지 확인할 수 있습니까? arrayLocation = GL.GetUniformLocation (programLocation, String ("characters"));'잘못된'arrayLocation'은 값이 쉐이더에 전달되지 않는 원인이 될 수 있습니다. – Harish

+0

사용중인 셰이더의 My Uniform 주소는 다음과 같습니다. http://i.imgur.com/dXC96lP.png 여기서 'characters'는 할당하려는 int 배열이고 다른 문자는 속성 및 유니폼입니다. 내 지식에 이것은 괜찮을 것입니다 - 그것들 중 아무 것도 -1로 보이지 않으므로 나는 그것이 적어도 존재한다고 가정합니다. 시간을내어 주셔서 감사합니다. – user2312610

관련 문제