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 (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...