将 GLSL 转换为 C#
本文关键字:转换 GLSL | 更新日期: 2023-09-27 18:33:37
大家好,有人可以帮助我将 glsl 转换为 C# 吗? 我是GLSL的新手,我真的需要很多帮助! 很高兴感谢您的所有帮助! :)
#version 120
uniform sampler2D tex;
void main()
{
vec4 pixcol = texture2D(tex, gl_TexCoord[0].xy);
vec4 colors[3];
colors[0] = vec4(0.,0.,1.,1.);
colors[1] = vec4(1.,1.,0.,1.);
colors[2] = vec4(1.,0.,0.,1.);
float lum = (pixcol.r+pixcol.g+pixcol.b)/3.;
int ix = (lum < 0.5)? 0:1;
vec4 thermal = mix(colors[ix],colors[ix+1],(lum-float(ix)*0.5)/0.5);
gl_FragColor = thermal;
}
您无需将 GLSL 转换为 c# 即可使用它,因为它由 OpenGL API 直接使用。c#有几个OpenGl包装器,不确定是否都支持着色器,但openTk肯定支持,示例在这里:
using (StreamReader sr = new StreamReader("vertex_shader.glsl"))
{
GL.ShaderSource(m_shader_handle, sr.ReadToEnd());
}
您可以从文件加载着色器,也可以直接从字符串加载着色器:
string shader = "void main() { // your shader code }"
GL.ShaderSource(m_shader_handle, shader);
类似于
参考代码的 c# 代码是(伪代码)
//Declares the texture/picture i.e. uniform sampler2D tex;
Bitmap x = new Bitmap();
float[] main()
{
// Looks up the color of a pixel for the specified coordinates, the color (as a rule of thumb)
// a normalized value i.e. vec4 pixcol = texture2D(tex, gl_TexCoord[0].xy);
Color pixcolUnnormalized= x.GetPixel();
float[] pixcol = new float[] { pixcolUnnormalized.r / 255.0f, pixcolUnnormalized.g / 255.0f, pixcolUnnormalized.b / 255.0f, pixcolUnnormalized.a / 255.0f);
//Setup coefficients i.e. vec4 colors[3]; colors[0] = vec4(0.,0.,1.,1.); colors[1] = vec4(1.,1.,0.,1.); colors[2] = vec4(1.,0.,0.,1.);
float[] color1[] = new float[] { 0.0,0.0,1.0,1.0 };
float[] color2[] = new float[] { 0.0,0.0,1.0,1.0 };
float[] color3[] = new float[] { 0.0,0.0,1.0,1.0 };
float[ float[] ] colors = new float[] { colors1, colors2, colors3 };
///Obtain luminance value from the pixel.
float lum = (pixcol[0]+pixcol[1] +pixcol[2])/3.;
int ix = (lum < 0.5)? 0:1;
//Interpolate the color values i.e. vec4 thermal = mix(colors[ix],colors[ix+1],(lum-float(ix)*0.5)/0.5);
float[] thermal = new float[] {
colors[ix][0] * ( 1 - (lum-float(ix)*0.5)/0.5) ) + colors[ix + 1][0] * (lum-float(ix)*0.5)/0.5)
colors[ix][1] * ( 1 - (lum-float(ix)*0.5)/0.5) ) + colors[ix + 1][1] * (lum-float(ix)*0.5)/0.5)
colors[ix][2] * ( 1 - (lum-float(ix)*0.5)/0.5) ) + colors[ix + 1][2] * (lum-float(ix)*0.5)/0.5)
colors[ix][3] * ( 1 - (lum-float(ix)*0.5)/0.5) ) + colors[ix + 1][3] * (lum-float(ix)*0.5)/0.5)
};
//return the value
return thermal;
}