2013-10-03 101 views
0

你好人能幫我把glsl轉換成c#嗎?我是glsl的新手,我真的需要很多幫助!高興地感謝你的幫助! :)將GLSL轉換爲C#

#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; 
} 
+0

正確的問題可能是如何轉化爲HLSL?你在使用Direct3d嗎? OpenGL和D3D着色器僅僅是一個非常大的API的一小部分,而不是語言的一部分。 – starmole

+0

你好! @starmole感謝您的回覆!我實際上是創建這種熱成像效果的C#窗體窗體應用程序,我得到的唯一參考是從http://coding-experiments.blogspot.sg/2010/10/thermal-vision-pixel-shader.html和我完全做不懂代碼。我已將opentk添加到我的視覺工作室 – user2598264

回答

3

您不需要將GLSL轉換爲c#以使用它,因爲它由OpenGL API直接使用。有對C#幾個OpenGL的包裝,不知道是否都支持着色器,但openTk支持是肯定的,例如是在這裏:

string shader = "void main() { // your shader code }" 
GL.ShaderSource(m_shader_handle, shader); 

using (StreamReader sr = new StreamReader("vertex_shader.glsl")) 
{ 
    GL.ShaderSource(m_shader_handle, sr.ReadToEnd()); 
} 

您可以從文件,或者從字符串直接加載着色器

+0

這確實有助於很多!非常感謝您的幫助:) @Giedrius – user2598264

+1

@ user2598264將其標記爲答案,然後顯示您的欣賞。 – Giedrius

+0

抱歉不介意我詢問,但是您是否知道任何API或SDK通過熱圖像計算髮熱溫度? @Giedrius – user2598264

0

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; 
} 
+0

非常感謝,這是有幫助的! :D不介意我問,但你知道任何API或SDK通過熱圖像計算髮熱溫度嗎? @勞倫斯角 – user2598264