如何解决OpenTK:将unifrorm数组和vec2d传递给片段着色器
我完成了this教程,并根据该代码创建了this项目,该项目涉及将一系列vec2发送到fragment shader。但是,由于所有将数组传递到着色器的尝试都失败了(只有第一个元素通过,其余的为零),因此我一直在努力实现这一点。当前,我通过为每个元素创建单独的制服来绕过此问题,但这一点都不理想(有4个数组,每个数组包含76个元素)。此外,我最终还是想用dvec2(OpenTK中的Vector2d)替换这些数组,但是我什至没有传递一个,而且我不确定为什么...我尝试使用GL.Uniform2的每个相关重载。 ,但似乎没有任何作用。这是我的代码的相关片段(可以从上面的链接中查看完整的代码):
// These two functions successfully get the values to the shader
public void SetVector2(string name,Vector2 data)
{
GL.UseProgram(Handle);
GL.Uniform2(uniformLocations[name],data);
}
// But this one does so very undesirably,passing to independent variables rather than directly to a uniform array
public void SetVector2Array(string name,Vector2[] data)
{/*
// This fails
var floats = new float[data.Length * 2];
for (int i = 0; i < data.Length * 2; i += 2)
{
floats[i] = data[i / 2].X;
floats[i + 1] = data[i / 2].Y;
}
GL.UseProgram(Handle);
//GL.Uniform2(uniformLocations[name],data.Length,floats);
GL.Uniform2(uniformLocations[name + "[0]"],floats);*/
GL.UseProgram(Handle);
for (int i = 0; i < data.Length; i++)
{
GL.Uniform2(uniformLocations[name + i],data[i]);
}
}
// This fails altogether... not really sure what value this sends,but it's not the right one
public void SetVector2d(string name,Vector2d data)
{
double[] d = new double[]
{
data.X,data.Y,};
GL.UseProgram(Handle);
GL.Uniform2(uniformLocations[name],2,d);
}
我的片段着色器看起来像这样(我想用一个简单的“ uniform vec2 array_name”替换这4个数组中的每一个):
#define MAX_MATING_ITER 76
uniform vec2 ma0;
uniform vec2 ma1;
uniform vec2 ma2;
uniform vec2 ma3;
uniform vec2 ma4;
uniform vec2 ma5;
uniform vec2 ma6;
uniform vec2 ma7;
uniform vec2 ma8;
uniform vec2 ma9;
...
uniform vec2 md67;
uniform vec2 md68;
uniform vec2 md69;
uniform vec2 md70;
uniform vec2 md71;
uniform vec2 md72;
uniform vec2 md73;
uniform vec2 md74;
uniform vec2 md75;
// The 4 arrays I use
vec2 ma[MAX_MATING_ITER];
vec2 mb[MAX_MATING_ITER];
vec2 mc[MAX_MATING_ITER];
vec2 md[MAX_MATING_ITER];
void main()
{
ma[0] = ma0;
ma[1] = ma1;
ma[2] = ma2;
ma[3] = ma3;
ma[4] = ma4;
ma[5] = ma5;
ma[6] = ma6;
ma[7] = ma7;
ma[8] = ma8;
ma[9] = ma9;
...
md[66] = md66;
md[67] = md67;
md[68] = md68;
md[69] = md69;
md[70] = md70;
md[71] = md71;
md[72] = md72;
md[73] = md73;
md[74] = md74;
md[75] = md75;
// Rest of the code
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。