Colors 在GLSL光线跟踪器中插值颜色

Colors 在GLSL光线跟踪器中插值颜色,colors,glsl,raytracing,Colors,Glsl,Raytracing,我试图在球体上的4个点之间插值颜色,这是我在片段着色器中跟踪的。我知道我必须给每条光线指定一种特定的颜色,我知道如何插值颜色。我的问题是,我不知道如何将特定颜色设置为特定光线 在这里: 这是我现场的一张照片。面片的角应该是红色(左下角)、绿色(左上角)、蓝色(右上角)和黄色(右下角),中间有插值颜色 这是我的片段着色器代码 // FragmentProgram #version 430 layout(location=0) out vec4 FragColor; layout (std430

我试图在球体上的4个点之间插值颜色,这是我在片段着色器中跟踪的。我知道我必须给每条光线指定一种特定的颜色,我知道如何插值颜色。我的问题是,我不知道如何将特定颜色设置为特定光线

在这里:

这是我现场的一张照片。面片的角应该是红色(左下角)、绿色(左上角)、蓝色(右上角)和黄色(右下角),中间有插值颜色

这是我的片段着色器代码

// FragmentProgram
#version 430

layout(location=0) out vec4 FragColor;
layout (std430, binding=3) buffer passColor
{
  float ssbo_Color[];
};
layout (std430, binding=4) buffer points
{
  float ssbo_Points[];
};

uniform vec3 camera_position;  

in vec3 ray_entry_point;

struct GridPoints
{
    vec3 p0;
    vec3 c0;
    vec3 p1;
    vec3 c1;
    vec3 p2;
    vec3 c2;
    vec3 p3;
    vec3 c3;
};

vec4 sph1 = vec4 (-2.0, 1.4, 0.0, 1.4);
vec4 sph2 = vec4 (2.0, 1.4, 0.0, 1.4);
GridPoints g;

float iSphere(in vec3 ro, in vec3 rd, in vec4 sph)
{
    vec3 o2c = ro - sph.xyz;
    float b = 2.0* dot(o2c, rd);
    float c = dot(o2c,o2c) - sph.w*sph.w;
    float h = b*b - 4.0*c;

    if (h<0.0){
        return -1.0;
    }
    float t = (-b - sqrt(h)) / 2.0;
    return t;
}

float iPlane(in vec3 ro, in vec3 rd)
{
    return -ro.y  / ( rd.y) ;
}

vec3 nPlane (in vec3 pos)
{
    return vec3(0.0, 1.0, 0.0);
}

float intersect(in vec3 ro, in vec3 rd, out float resT)
{
    resT = 10000000.0;
    float id = -1.0;
    float tsph1 = iSphere(ro, rd, sph1);
    float tsph2 = iSphere(ro, rd, sph2);
    float tpla = iPlane(ro, rd);

    if( tsph1 > 0.0){
        id = 1.0;
        resT = tsph1;
    }
    if( tsph2 > 0.0){
        id = 1.0;
        resT = tsph2;
    }
    if ( tpla > 0.0 && tpla < resT){
        id = 2.0;
        resT = tpla;
    }

    return id;
}

void main()
{
    vec3 light_pos = normalize(vec3(0.0,0.0,-1.0));
    vec4 col = vec4(0.2);

    vec3 ro = ray_entry_point + vec3(0.0,0.5,0.0);
    vec3 rd = -normalize(camera_position - ray_entry_point );
    float t;

    float id = intersect(ro, rd, t);
    // Test Points
    g.p0.x = ssbo_Points[0];
    g.p0.y = ssbo_Points[1];
    g.p0.z = ssbo_Points[2];

    g.p1.x = ssbo_Points[168];
    g.p1.y = ssbo_Points[169];
    g.p1.z = ssbo_Points[170];

    g.p2.x = ssbo_Points[168+3];
    g.p2.y = ssbo_Points[169+3];
    g.p2.z = ssbo_Points[170+3];

    g.p3.x = ssbo_Points[3];
    g.p3.y = ssbo_Points[4];
    g.p3.z = ssbo_Points[5];


    vec3 d = (g.p0+g.p1+g.p2+g.p3)/4; //Vector to midpoint of patch
    vec3 dc = d - sph1.xyz; // Vector to sphere center
    vec3 d_true = d -(sqrt(pow(sph1.w,2))-sqrt(pow(dc.x,2)+ pow(dc.y,2)+pow(dc.z,2))); // Real vector to midpoint of patch

    vec3 patch_col;
    vec3 pos;
    // Test Colors
    g.c0 = vec3(1,0,0);
    g.c1 = vec3(0,1,0);
    g.c2 = vec3(0,0,1);
    g.c3 = vec3(1,1,0);

    if( id > 0.0 && id < 1.5) {
        // hit sphere
        pos = ro + t*rd;
        col = vec4 (0.1, 0.1, 0.1, 1);
        if(abs(pos.y) > abs(g.p0.y) && abs(pos.y) < abs(g.p1.y) &&
           abs(pos.x) < abs(g.p0.x) && abs(pos.x) > abs(g.p2.x)){

            pos = ro + t*rd;
            // Interpolated Color
            patch_col = g.c0 + (g.c1-g.c0)/(g.p1.y-g.p0.y)*(pos.y-g.p1.y);

            col = vec4(patch_col,1);
        }
    }
    else if ( id > 1.5){
        // hit plane
        vec3 pos = ro + t*rd ;

        vec3 nor_L = nPlane(pos);
        float dif_L = clamp(dot( nor_L, light_pos), 0.0, 1.0);
        float amb_L = smoothstep(0.0, sph1.w, length(pos.xz-sph1.xz));

        vec3 nor_R = nPlane(pos);
        float dif_R = clamp(dot( nor_R, light_pos), 0.0, 1.0);
        float amb_R = smoothstep(0.0, sph2.w, length(pos.xz-sph2.xz));

        col = vec4(vec3(0.2, 0.2, 0.2) * amb_R*amb_L ,1.0);
    }
    FragColor = col;
}
//碎片程序
#版本430
布局(位置=0)输出vec4 FragColor;
布局(std430,绑定=3)缓冲区passColor
{
浮动ssbo_颜色[];
};
布局(std430,绑定=4)缓冲点
{
浮动ssbo_点[];
};
均匀的vec3摄像机位置;
在vec3射线进入点;
结构网格点
{
vec3-p0;
vec3 c0;
vec3p1;
vec3-c1;
VEC3P2;
vec3-c2;
vec3-p3;
vec3;
};
vec4 sph1=vec4(-2.0,1.4,0.0,1.4);
vec4-sph2=vec4(2.0,1.4,0.0,1.4);
网格点g;
浮点数(在vec3 ro、vec3 rd、vec4 sph中)
{
vec3o2c=ro-sph.xyz;
浮点数b=2.0*点(o2c,rd);
浮点数c=点(o2c,o2c)-sph.w*sph.w;
浮动h=b*b-4.0*c;
if(h0.0){
id=1.0;
resT=tsph1;
}
如果(tsph2>0.0){
id=1.0;
resT=tsph2;
}
如果(tpla>0.0&&tpla0.0&&id<1.5){
//击球
pos=ro+t*rd;
col=vec4(0.1,0.1,0.1,1);
如果(abs(pos.y)>abs(g.p0.y)&abs(pos.y)abs(g.p2.x)){
pos=ro+t*rd;
//插值颜色
patch_col=g.c0+(g.c1-g.c0)/(g.p1.y-g.p0.y)*(pos.y-g.p1.y);
col=vec4(patch_col,1);
}
}
否则,如果(id>1.5){
//撞机
vec3位置=ro+t*rd;
vec3 nor_L=平面(位置);
浮动dif_L=夹具(点(非点、灯位置),0.0,1.0);
浮动amb_L=平滑步长(0.0,sph1.w,长度(位置xz-sph1.xz));
vec3 nor=平面(位置);
浮动dif_R=夹具(点(nor_R,灯位置),0.0,1.0);
浮动amb_R=平滑步长(0.0,sph2.w,长度(位置xz-sph2.xz));
col=vec4(vec3(0.2,0.2,0.2)*amb_R*amb_L,1.0);
}
FragColor=col;
}

任何提示都会有所帮助。

我正在通过SSBO传递点位置和颜色。整个场景是通过光线跟踪创建的。我通过顶点着色器的唯一顶点来自场景中的立方体,你能在Shadertoy()示例中打开你的代码吗?这将为我们提供一个最小的、可验证的示例,并为您提供更好的帮助机会