为什么这个GLSL着色器程序会出现错误?

问题描述 投票:0回答:1

我目前正在尝试创建一个程序,渲染由16个控制点的坐标确定的表面。(使用webGL2)但是,这个着色器程序似乎有一个错误,并且渲染没有正确显示。现在,我将 16 个点设置为单独的 vec4 统一变量,并创建这些统一的数组以在主函数的循环中访问它们。我知道这种方法是硬编码,但我现在至少想让一些东西出现在屏幕上。

这是我的顶点着色器程序

#version 300 es
#define M_PI 3.1415926535897932384626433832795
layout(location=${loc_aTexCoords}) in vec2 aTexCoords;

uniform mat4 MVP;
uniform mat4 MV;
uniform mat4 matNormal;

uniform vec4 CP0;
uniform vec4 CP1;
uniform vec4 CP2;
uniform vec4 CP3;
uniform vec4 CP4;
uniform vec4 CP5;
uniform vec4 CP6;
uniform vec4 CP7;
uniform vec4 CP8;
uniform vec4 CP9;
uniform vec4 CP10;
uniform vec4 CP11;
uniform vec4 CP12;
uniform vec4 CP13;
uniform vec4 CP14;
uniform vec4 CP15;

vec4 array[16] = [CP15, CP12, CP13, CP14,
                    CP11, CP8, CP9, CP10,
                    CP3, CP0, CP1, CP2,
                    CP7, CP4, CP5, CP6];

out vec2 vTexCoords;

float B(t,n){
    if(n==0){
        return (1.0-t)*(1.0-t)*(1.0-t)/6.0
    }
    else if(n==1){
        return (3.0*t*t*t-6.0*t*t+4.0)/6.0
    }
    else if(n==2){
        return (-3.0*t*t*t+3.0*t*t+3.0*t+1.0)/6.0
    }
    else if(n==3){
        return t*t*t/6.0
    }
    return 0.0;
}

void main() 
{
    vec4 p = [0,0,0,0];
    
    for(int i=0;i<4;i++){
        for(int j=0;j<4;j++){
            p += B(aTexCoords.s,i)*B(aTexCoords.t,j)*array[4*i+j];
        }
    }

    gl_Position = MVP * p
    vTexCoords = aTexCoords;
}





let p1 = [points.Points[0],points.Points[1],points.Points[2],1];
let p2 = [points.Points[3],points.Points[4],points.Points[5],1];
//and more...
gl.uniform4fv(patch.shader.loc_uniforms["CP0"],p1);
gl.uniform4fv(patch.shader.loc_uniforms["CP1"],p2);
//and more...

这就是我在 js 中更新制服的方式

javascript glsl webgl webgl2
1个回答
0
投票

看起来您正在开发用于贝塞尔曲面评估的 GLSL 着色器,并且您正在将控制点作为制服传递给着色器。

GLSL不支持这种方式的数组初始化。您需要单独设置这些值。您可以使用 mat4 类型来实现此目的。 函数定义:

您似乎正在定义一个函数来计算伯恩斯坦基函数 进行这些调整后,您的着色器代码在语法上应该更加正确。确保检查算法中是否存在任何其他逻辑错误,并确保在 JavaScript 代码中正确设置提供的控制点(CP0、CP1 等)

如果您想要正确的代码,我也给您代码,请将您的电子邮件发送给我

谢谢

© www.soinside.com 2019 - 2024. All rights reserved.