Opengl 将ARB着色器转换为GLSL

Opengl 将ARB着色器转换为GLSL,opengl,glsl,Opengl,Glsl,我找到了一对用ARB编写的着色器。我需要帮助 转换GLSL(1.2)中的那些。我想扩展一个项目 使用那些ARB着色器,但是学习GLSL我认为 将是easiser habe GLSL着色器,这就是为什么我需要 转化。 我试图改变他们,但我知道我做错了什么。 有人能帮我详细解释一下吗 那些ARB着色器并提供转换 ---原始ARB v1.0着色器---- 顶点着色引擎 # 片段着色器 # 我的atempt无法转换它们: /////////顶点着色器////////// //#version 120

我找到了一对用ARB编写的着色器。我需要帮助 转换GLSL(1.2)中的那些。我想扩展一个项目 使用那些ARB着色器,但是学习GLSL我认为 将是easiser habe GLSL着色器,这就是为什么我需要 转化。 我试图改变他们,但我知道我做错了什么。 有人能帮我详细解释一下吗 那些ARB着色器并提供转换

---原始ARB v1.0着色器----

顶点着色引擎 # 片段着色器 # 我的atempt无法转换它们:

/////////顶点着色器//////////

//#version 120

//OPTION ARB_position_invariant;

//var locala vertex shader
uniform vec4 cameraPos; //program.local[0]

//var vertex + fragment shader

varying vec4 waterTex0; //
varying vec4 waterTex1; //eyepos
varying vec4 waterTex2; //
varying vec4 waterTex3; //

void main(void)
{

//TEMP r0;
vec4 eyePos;

// get eye to vertex
//ADD r0, vertex.position, -program.local[0];
eyePos = gl_Vertex - cameraPos;

// stuff for scaling the detail normal tex by distance
//DP3 r0.w, r0, r0;
//RCP r0.w, r0.w;
//MUL r0.w, r0.w, 250000;
//MIN r0.w, r0.w, 1;
eyePos.w = dot(eyePos, eyePos);
eyePos.w = min(1.0 / eyePos.w * 250000, 1.0);


// eye to vertex
//MOV result.texcoord[1], r0;
waterTex1 = eyePos;

// normal tex coord
//MOV result.texcoord[0], vertex.texcoord[0];
waterTex0 = gl_MultiTexCoord0;

// detail normal tex coord
//MUL result.texcoord[3], vertex.texcoord[0], 5;
waterTex3 = gl_MultiTexCoord0 * 5; 

// not used currently, surface normal
//MOV result.texcoord[2].x, -r0.y;

//END

//transformam pozitia vertexilor
//gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
gl_Position = ftransform();
}
//#version 120

//var locale fragment shader
//TEMP r0;
//TEMP r1;
//TEMP r2;
//TEMP r3;
//TEMP r4;


uniform vec4 texScale1; //program.local[0]
uniform vec4 texScale2; //program.local[1]
uniform vec4 waterColor; //program.local[2]
uniform vec4 lightDir; //program.local[3]
uniform vec4 specularColor; //program.local[4]

uniform sampler2D normalTex;
uniform sampler2D reflTex; 

//var vertex + fragment shader
varying vec4 waterTex0; //
varying vec4 waterTex1; //eyepos
varying vec4 waterTex2; //
varying vec4 waterTex3; //

void main(void)
{

//PARAM p0 = {-7, 0.5, 32, 0.2};
const vec4 p0 = vec4(-7.0, 0.5, 32.0, 0.2);
//PARAM p1 = {0, 1, 0, .6};
const vec4 p1 = vec4(0.0, 1.0, 0.0, 0.6);

// normal tex
//TEX r0, fragment.texcoord[0], texture[0], 2D;
vec4 vNormT = texture2D(normalTex, vec2(waterTex0));

// detail normal tex
//TEX r1, fragment.texcoord[3], texture[0], 2D;
vec vDetailNormT = texture2D(normalTex, vec(waterTex3));

//scale & bias to [-1, 1]
//MAD r0, r0, 2, -1;
vNormT *= 2;
vNormT = clamp(vNormT, -1, 1);
//MAD r1, r1, 2, -1;
vDetailNormT *= 2;
vDetailNormT = clamp(vNormT, -1.0, 1.0); //clamp la [-1, 1]

// scale detail normal tex by some factor based on eye distance
// maybe replace this with smoothed out mipmap levels
//MUL r1, r1, fragment.texcoord[1].w;
vDetailNormT *= waterTex1.w;

/// instead of per vertex normals it is all done in textures
/// ADD r0, r0, fragment.texcoord[2];
//ADD r0, r0, r1;
//DP3 r0.w, r0, r0;
//RSQ r0.w, r0.w;
//MUL r0, r0, r0.w;
vNormT += vDetailNormT;
vNormT = normalize(vNormT);

// normalize the eye to vertex vector
//DP3 r2.w, fragment.texcoord[1], fragment.texcoord[1];
//RSQ r2.w, r2.w;
//MUL r2, fragment.texcoord[1], r2.w;
vec4 vEyePosN = normalize(waterTex1);

// bias towards an up vector when on edge/far away
//POW r3.w, -r2.y, p1.w;
//MOV r4, r0;
//LRP r0, r3.w, r0, p1;
vec4 vHalfAngle = vec4(0);
vHalfAngle.w = pow(-vEyePosN.y, p1.w); //in loc de r3.w

vec4 vNormTtt = vNormT;
//LRP R0, R0, R1, R2: is R0*R1+(1-R0)*R2
//vNormT = vec4(vNormT * vHalfAngle.w) + vec4(p1 * (1.0 - vHalfAngle.w));
vNormT = mix(vNormT, p1, vHalfAngle.w); //functie interpoalre liniara

// specular needs to be biased less, or not at all
//LRP r4, r3.w, r0, r4;
//vNormTtt = vec4(vNormT * vHalfAngle.w) + vec4(vNormTtt * (1.0 - vHalfAngle.w));
vNormTtt = mix(vNormT, vNormTtt, vHalfAngle.w);

// vertex to eye * normal, clamped
//DP3_SAT r2.w, -r2, r0;
// ???
vEyePosN.w = clamp(dot(-vEyePosN, vNormT), 0.0, 1.0); //DP3_SAT <=> dot() si clamp()


// get the half angle vector and normalize
//ADD r3, -r2, program.local[3];
//DP3 r3.w, r3, r3;
//RSQ r3.w, r3.w;
//MUL r3, r3, r3.w;
vHalfAngle = lightDir - vEyePosN;
vHalfAngle = normalize(vHalfAngle);

// half angle * normal
//DP3_SAT r0.w, r3, r4;
vNormT.w = clamp(dot(vHalfAngle, vNormTtt), 0.0, 1.0);

// specular exponent
//POW r0.w, r0.w, p0.z;
vNormT.w = pow(vNormT, p0.z);

// fresnel = (1 + eye-normal dot product) ^ -7    (an approximation)
// could probably approximate with 1 - dot(vertex to eye, normal)
//ADD r3.w, 1, r2.w;
//POW r3.w, r3.w, p0.x;
vHalfAngle.w = vEyePosN.w + 1.0;
vHalfAngle.w = pow(vHalfAngle.w, p0.x);

// prepare the reflection texture coords (uses n.x and n.z as an offset)
//MOV r0.y, r0.z;
vNormT.y = vNormT.z;

// scale and bias screen position to get reflection texcoords - could do this in vertex program?
//MAD r1, fragment.position, program.local[0], program.local[1];
//trebuie sa mut acesata linie in vertex shader, sa vad cum fac ...?
vDetailNormT = gl_Position * texScale1;
vDetailNormT += texScale2;

// offset coords by normal, scaled down by distance (extra 10x factor stored in program.local[0].z)
//RCP r1.z, r1.z;
//MAD r1, r0, r1.z, r1;
vDetailNormT.z = 1 / vDetailNormT.z;
vNormT *= vDetailNormT.z;
vDetailNormT += vNormT;

// offset reflection lookup
//TEX r1, r1, texture[1], 2D;
vDetailNormT = texture2D(reflTex, vDetailNormT);

// specular
//MUL r3.xyz, r0.w, program.local[4];
vHalfAngle.xyz = specularColor * vNormT.w;
// reflection * fresnel
//MAD r1, r1, r3.w, r3;
vDetailNormT *= vHalfAngle.w;
vDetailNormT += vHalfAngle;

// add water color * (1 - fresnel)
//ADD r3.w, 1, -r3.w;
//MAD result.color, program.local[2], r3.w, r1;
vHalfAngle.w = 1.0 - vHalfAngle.w;
waterColor *= vHalfAngle.w;

gl_FragColor = waterColor + vDetailNormT;

//END

}
///////////////片段着色器//////////////

//#version 120

//OPTION ARB_position_invariant;

//var locala vertex shader
uniform vec4 cameraPos; //program.local[0]

//var vertex + fragment shader

varying vec4 waterTex0; //
varying vec4 waterTex1; //eyepos
varying vec4 waterTex2; //
varying vec4 waterTex3; //

void main(void)
{

//TEMP r0;
vec4 eyePos;

// get eye to vertex
//ADD r0, vertex.position, -program.local[0];
eyePos = gl_Vertex - cameraPos;

// stuff for scaling the detail normal tex by distance
//DP3 r0.w, r0, r0;
//RCP r0.w, r0.w;
//MUL r0.w, r0.w, 250000;
//MIN r0.w, r0.w, 1;
eyePos.w = dot(eyePos, eyePos);
eyePos.w = min(1.0 / eyePos.w * 250000, 1.0);


// eye to vertex
//MOV result.texcoord[1], r0;
waterTex1 = eyePos;

// normal tex coord
//MOV result.texcoord[0], vertex.texcoord[0];
waterTex0 = gl_MultiTexCoord0;

// detail normal tex coord
//MUL result.texcoord[3], vertex.texcoord[0], 5;
waterTex3 = gl_MultiTexCoord0 * 5; 

// not used currently, surface normal
//MOV result.texcoord[2].x, -r0.y;

//END

//transformam pozitia vertexilor
//gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
gl_Position = ftransform();
}
//#version 120

//var locale fragment shader
//TEMP r0;
//TEMP r1;
//TEMP r2;
//TEMP r3;
//TEMP r4;


uniform vec4 texScale1; //program.local[0]
uniform vec4 texScale2; //program.local[1]
uniform vec4 waterColor; //program.local[2]
uniform vec4 lightDir; //program.local[3]
uniform vec4 specularColor; //program.local[4]

uniform sampler2D normalTex;
uniform sampler2D reflTex; 

//var vertex + fragment shader
varying vec4 waterTex0; //
varying vec4 waterTex1; //eyepos
varying vec4 waterTex2; //
varying vec4 waterTex3; //

void main(void)
{

//PARAM p0 = {-7, 0.5, 32, 0.2};
const vec4 p0 = vec4(-7.0, 0.5, 32.0, 0.2);
//PARAM p1 = {0, 1, 0, .6};
const vec4 p1 = vec4(0.0, 1.0, 0.0, 0.6);

// normal tex
//TEX r0, fragment.texcoord[0], texture[0], 2D;
vec4 vNormT = texture2D(normalTex, vec2(waterTex0));

// detail normal tex
//TEX r1, fragment.texcoord[3], texture[0], 2D;
vec vDetailNormT = texture2D(normalTex, vec(waterTex3));

//scale & bias to [-1, 1]
//MAD r0, r0, 2, -1;
vNormT *= 2;
vNormT = clamp(vNormT, -1, 1);
//MAD r1, r1, 2, -1;
vDetailNormT *= 2;
vDetailNormT = clamp(vNormT, -1.0, 1.0); //clamp la [-1, 1]

// scale detail normal tex by some factor based on eye distance
// maybe replace this with smoothed out mipmap levels
//MUL r1, r1, fragment.texcoord[1].w;
vDetailNormT *= waterTex1.w;

/// instead of per vertex normals it is all done in textures
/// ADD r0, r0, fragment.texcoord[2];
//ADD r0, r0, r1;
//DP3 r0.w, r0, r0;
//RSQ r0.w, r0.w;
//MUL r0, r0, r0.w;
vNormT += vDetailNormT;
vNormT = normalize(vNormT);

// normalize the eye to vertex vector
//DP3 r2.w, fragment.texcoord[1], fragment.texcoord[1];
//RSQ r2.w, r2.w;
//MUL r2, fragment.texcoord[1], r2.w;
vec4 vEyePosN = normalize(waterTex1);

// bias towards an up vector when on edge/far away
//POW r3.w, -r2.y, p1.w;
//MOV r4, r0;
//LRP r0, r3.w, r0, p1;
vec4 vHalfAngle = vec4(0);
vHalfAngle.w = pow(-vEyePosN.y, p1.w); //in loc de r3.w

vec4 vNormTtt = vNormT;
//LRP R0, R0, R1, R2: is R0*R1+(1-R0)*R2
//vNormT = vec4(vNormT * vHalfAngle.w) + vec4(p1 * (1.0 - vHalfAngle.w));
vNormT = mix(vNormT, p1, vHalfAngle.w); //functie interpoalre liniara

// specular needs to be biased less, or not at all
//LRP r4, r3.w, r0, r4;
//vNormTtt = vec4(vNormT * vHalfAngle.w) + vec4(vNormTtt * (1.0 - vHalfAngle.w));
vNormTtt = mix(vNormT, vNormTtt, vHalfAngle.w);

// vertex to eye * normal, clamped
//DP3_SAT r2.w, -r2, r0;
// ???
vEyePosN.w = clamp(dot(-vEyePosN, vNormT), 0.0, 1.0); //DP3_SAT <=> dot() si clamp()


// get the half angle vector and normalize
//ADD r3, -r2, program.local[3];
//DP3 r3.w, r3, r3;
//RSQ r3.w, r3.w;
//MUL r3, r3, r3.w;
vHalfAngle = lightDir - vEyePosN;
vHalfAngle = normalize(vHalfAngle);

// half angle * normal
//DP3_SAT r0.w, r3, r4;
vNormT.w = clamp(dot(vHalfAngle, vNormTtt), 0.0, 1.0);

// specular exponent
//POW r0.w, r0.w, p0.z;
vNormT.w = pow(vNormT, p0.z);

// fresnel = (1 + eye-normal dot product) ^ -7    (an approximation)
// could probably approximate with 1 - dot(vertex to eye, normal)
//ADD r3.w, 1, r2.w;
//POW r3.w, r3.w, p0.x;
vHalfAngle.w = vEyePosN.w + 1.0;
vHalfAngle.w = pow(vHalfAngle.w, p0.x);

// prepare the reflection texture coords (uses n.x and n.z as an offset)
//MOV r0.y, r0.z;
vNormT.y = vNormT.z;

// scale and bias screen position to get reflection texcoords - could do this in vertex program?
//MAD r1, fragment.position, program.local[0], program.local[1];
//trebuie sa mut acesata linie in vertex shader, sa vad cum fac ...?
vDetailNormT = gl_Position * texScale1;
vDetailNormT += texScale2;

// offset coords by normal, scaled down by distance (extra 10x factor stored in program.local[0].z)
//RCP r1.z, r1.z;
//MAD r1, r0, r1.z, r1;
vDetailNormT.z = 1 / vDetailNormT.z;
vNormT *= vDetailNormT.z;
vDetailNormT += vNormT;

// offset reflection lookup
//TEX r1, r1, texture[1], 2D;
vDetailNormT = texture2D(reflTex, vDetailNormT);

// specular
//MUL r3.xyz, r0.w, program.local[4];
vHalfAngle.xyz = specularColor * vNormT.w;
// reflection * fresnel
//MAD r1, r1, r3.w, r3;
vDetailNormT *= vHalfAngle.w;
vDetailNormT += vHalfAngle;

// add water color * (1 - fresnel)
//ADD r3.w, 1, -r3.w;
//MAD result.color, program.local[2], r3.w, r1;
vHalfAngle.w = 1.0 - vHalfAngle.w;
waterColor *= vHalfAngle.w;

gl_FragColor = waterColor + vDetailNormT;

//END

}
/#版本120
//var区域设置片段着色器
//温度r0;
//温度r1;
//温度r2;
//温度r3;
//温度r4;
均匀vec4 texScale1//program.local[0]
均匀vec4 texScale2//程序.本地[1]
均匀vec4水彩//程序.本地[2]
均匀vec4-lightDir//程序.本地[3]
均匀vec4镜面颜色//程序.本地[4]
均匀取样器2d-normalTex;
均匀取样器;
//var顶点+片段着色器
可变vec4-waterTex0//
可变vec4-waterTex1//eyepos
可变vec4-waterTex2//
可变vec4-waterTex3//
真空总管(真空)
{
//参数p0={-7,0.5,32,0.2};
常数vec4 p0=vec4(-7.0,0.5,32.0,0.2);
//参数p1={0,1,0,6};
常数vec4 p1=vec4(0.0,1.0,0.0,0.6);
//普通特
//TEX r0,fragment.texcoord[0],纹理[0],二维;
vec4 vNormT=纹理2d(normalTex,vec2(waterTex0));
//细部标准纹理
//TEX r1,fragment.texcoord[3],纹理[0],二维;
vec vDetailNormT=纹理2d(normalTex,vec(waterTex3));
//比例和偏差为[-1,1]
//MAD r0,r0,2,-1;
vNormT*=2;
vNormT=夹具(vNormT,-1,1);
//MAD r1,r1,2,-1;
vDetailNormT*=2;
vDetailNormT=钳位(vNormT,-1.0,1.0);//钳位la[-1,1]
//按基于眼睛距离的某些因子缩放细节法线纹理
//也许可以用平滑的mipmap级别来代替它
//MUL r1,r1,fragment.texcoord[1].w;
vDetailNormT*=waterTex1.w;
///它不是逐顶点法线,而是在纹理中完成
///添加r0,r0,fragment.texcoord[2];
//加上r0,r0,r1;
//dp3r0.w,r0,r0;
//RSQ r0.w,r0.w;
//mulr0,r0,r0.w;
vNormT+=vDetailNormT;
vNormT=标准化(vNormT);
//规范化眼到顶点向量
//DP3 r2.w,fragment.texcoord[1],fragment.texcoord[1];
//RSQ r2.w,r2.w;
//MulR2,fragment.texcoord[1],r2.w;
vec4 vEyePosN=标准化(waterTex1);
//在边缘/远处时偏向上方向向量
//功率r3.w,-r2.y,p1.w;
//MOV r4,r0;
//LRP r0,r3.w,r0,p1;
vec4 vHalfAngle=vec4(0);
vHalfAngle.w=pow(-vEyePosN.y,p1.w);//位于r3.w位置
vec4 vNormTtt=vNormT;
//LRP R0,R0,R1,R2:是R0*R1+(1-R0)*R2
//vNormT=vec4(vNormT*vHalfAngle.w)+vec4(p1*(1.0-vHalfAngle.w));
vNormT=mix(vNormT,p1,vHalfAngle.w);//函数interpolre liniara
//镜面反射需要更少的偏差,或者根本不需要
//LRP r4,r3.w,r0,r4;
//vNormTtt=vec4(vNormT*vHalfAngle.w)+vec4(vNormTtt*(1.0-vHalfAngle.w));
vNormTtt=混合(vNormT,vNormTtt,vHalfAngle.w);
//顶点到眼睛*正常,夹紧
//DP3_卫星r2.w,-r2,r0;
// ???
w=钳位(点(-vEyePosN,vNormT),0.0,1.0);//DP3_SAT dot()si-clamp()
//获取半角向量并进行规格化
//添加r3,-r2,program.local[3];
//DP3 r3.w,r3,r3;
//RSQ r3.w,r3.w;
//MUL r3,r3,r3.w;
vHalfAngle=lightDir-vEyePosN;
vHalfAngle=标准化(vHalfAngle);
//半角*法线
//DP3_卫星r0.w,r3,r4;
vNormT.w=夹具(点(vHalfAngle,vNormTtt),0.0,1.0);
//镜面反射指数
//功率r0.w,r0.w,p0.z;
vNormT.w=pow(vNormT,p0.z);
//菲涅耳=(1+眼睛正常点积)^-7(近似值)
//可能接近1点(顶点到眼睛,正常)
//加上r3.w,1,r2.w;
//功率r3.w,r3.w,p0.x;
vHalfAngle.w=vEyePosN.w+1.0;
vHalfAngle.w=功率(vHalfAngle.w,p0.x);
//准备反射纹理坐标(使用n.x和n.z作为偏移)
//MOV r0.y,r0.z;
vNormT.y=vNormT.z;
//缩放和偏移屏幕位置以获得反射纹理坐标-可以在顶点程序中执行此操作吗?
//MAD r1,fragment.position,program.local[0],program.local[1];
//在顶点着色器中使用多个纹理,是vad还是fac。。。?
vDetailNormT=gl_位置*texScale1;
vDetailNormT+=texScale2;
//按法线偏移坐标,按距离缩小(额外的10倍因子存储在program.local[0].z中)
//RCP r1.z,r1.z;
//MAD r1,r0,r1.z,r1;
vDetailNormT.z=1/vDetailNormT.z;
vNormT*=vDetailNormT.z;
vDetailNormT+=vNormT;
//偏移反射查找
//TEX r1,r1,纹理[1],2D;
vDetailNormT=纹理2d(reflTex,vDetailNormT);
//镜面反射
//MUL r3.xyz,r0.w,program.local[4];
vHalfAngle.xyz=镜面颜色*vNormT.w;
//菲涅耳反射
//MAD r1,r1,r3.w,r3;
vDetailNormT*=vHalfAngle.w;
vDetailNormT+=vHalfAngle;
//添加水彩*(1-菲涅耳)
//加上r3.w,1,-r3.w;
//MAD result.color,program.local[2],r3.w,r1;
vHalfAngle.w=1.0-vHalfAngle.w;
水彩画*=vHalfAngle.w;
gl_FragColor=水彩画+vDetailNormT;
//结束
}

啊,可怕的过去

在我看来,正在渲染的几何体有两个表面法线纹理贴图,一个是“法线”贴图,另一个是“细节”贴图,可能在特写时分辨率更高

顶点着色器计算距离眼睛的距离,并将其缩放为250000的一小部分,可能是世界的大小或距离

片段着色器从纹理贴图获取曲面法线,然后使用顶点着色器计算的距离值添加最近细节曲面法线的加权分数。这可确保在一定距离内,曲面法线不会随着对象的移动而急剧变化

然后是一个标准的环境漫反射镜面照明计算,尽管在注释“偏向上方向向量”处有一个额外的调整

有趣的一点是从“菲涅尔=(1+”AFAIK开始的,它用于计算在水下观看物体(或在水下观看空气中的物体)时产生的失真。碎片位置的使用表明存在屏幕分辨率大小的反射/环境