我正在构建一个着色器程序,以在GLSL中呈现一个简单的位图字体。
我的编程环境是C#,所以我使用OpenTK来封装OpenGL 4.0,但语法与C和C ++中的任何示例非常相似。
我的问题是我正在尝试将整数数组传递给片段着色器,但每当我这样做时,所有数组元素最终都为零。整数应该在0到255之间,我在发送之前和之后都检查了它们。这令人气愤。
目前我正在绑定我的程序,然后尝试使用以下指令将int []数组发送到着色器:
int[] ints = new int[] { 33, 34, 35, 36, 37, 38, 39, 40 };
GL.UseProgram(programLocation);
GL.Uniform1(arrayLocation, ints.Length, ints);
我的片段着色器获取数组并使用几个函数来确定四边形的哪个部分放置哪些字符。我已经使用静态数字和数组测试了这些函数,我在着色器中手动构建,它们正如我所期望的那样工作。由于某种原因,上面的语法实际上并不会最终发送任何数据 - 所有元素都计算为0。
在我的着色器中,数组被表示并使用如下:
uniform int characters[8];
....
gl_FragColor = texture2D(bitmapFontTex, GetBitmapFontStart(characters[0...8etc]));
我的其余代码似乎在隔离测试时起作用 - 只有当它汇集在一起时它才会崩溃,而上面的代码块就是它汇集在一起的地方。我是否犯了一些愚蠢的菜鸟错误,或者是否有更棘手的事情发生?非常感谢任何帮助。
答案 0 :(得分:2)
您使用的是glUniform*()
的错误版本
您要用于发送一维整数数组的内容是glUniform1iv()
。
注意i
对于int是什么,f
对于float。数字代表元素的数量。
现在,对于数组后缀v
,数字代表维度。
GL.Uniform1iv(arrayLocation, ints.Length, ints);
这是一个供参考的链接 https://www.opengl.org/sdk/docs/man/docbook4/xhtml/glUniform.xml