一般来说,问题在标题中。
我无法理解如何使用GetActiveUniform
功能。
public void GetActiveUniform(uint program,
uint index,
int bufSize,
int[] length,
int[] size,
uint[] type,
string name);
我的尝试看起来像这样(一切都已编译和链接):
int[] numberOfUniforms = new int[1];
Gl.GetProgram(programId, ProgramParameter.ActiveUniforms, numberOfUniforms);
int[] uniformNameMaxLength = new int[1];
Gl.GetProgram(programId, ProgramParameter.ActiveUniformMaxLength, uniformNameMaxLength);
int unifromCount = numberOfUniforms[0];
for (uint i = 0; i < unifromCount; i++)
{
var uniformSize = new int[1];
var unifromLength = new int[1];
var uniformType = new uint[1];
string uniformName = "";
Gl.GetActiveUniform(programId, i, uniformNameMaxLength[0], unifromLength, uniformSize, uniformType, uniformName);
}
顶点着色器:
#version 150 core
in vec3 in_Position;
out vec3 pass_Color;
uniform vec3 color;
void main(void) {
gl_Position = vec4(in_Position, 1.0);
pass_Color = color;
}
通话结束后,我得到了合适的uniformSize,长度和类型,但没有名字。
答案 0 :(得分:2)
就OpenGL的使用而言,您正确地执行此操作。问题来自您正在使用的SharpGL绑定。由于最后一个参数被声明为类型string
并且字符串(大多数)在.NET中是不可变的,因此该函数无法输出您的名称。如果没有自己修改绑定,您有两个选择:
GetActiveUniform
重载,它将一个可变对象作为名称参数,例如StringBuilder
,char[]
或甚至out string
(通过参考)。ref
参数,而不是创建大量的单元素数组。我强烈推荐它。