【发布时间】:2019-11-23 19:03:03
【问题描述】:
我正在使用三个 glcontrols 说 GlControl1、GlControl2、GlControl3。 我有两个纹理 stexture1 和 stexture2。 stexture1 在 glcontrol2 中显示的位置。 stexture2 的右半部分显示在 glcontrol1 上,左半部分显示在 glcontrol3 上。 现在我想在这三个 glcontrols 上应用投影。使用这个link,我可以在glcontrol2 上成功应用它,因为它可以完全显示纹理。
但是在 glcontrol1 和 glcontrol3 上应用时,它不能正常工作。
请查看我正在尝试的着色器代码。
GL.ShaderSource(fragShader, @"precision highp float;
uniform sampler2D sTexture_1;
uniform sampler2D sTexture_2;
uniform float sSelectedRangeLeft;
uniform float sSelectedRangeRight;
uniform float sSelectedRangeLeftEnd;
uniform float sSelectedRangeRightEnd;
uniform int sCurrentGLControl;
varying vec2 vTexCoordIn;
void main ()
{
vec2 vTexCoord=vec2(vTexCoordIn.x,vTexCoordIn.y);
float rightsliderStartval=sSelectedRangeRight;//0.5(value between 0.5 and 1.0)
float rightsliderEndval=sSelectedRangeRightEnd;//1.0(value between 0.5 and 1.0)
float rightsliderDelta=rightsliderEndval-rightsliderStartval;
float leftsliderStartval=sSelectedRangeLeftEnd;//0.0(value between 0 and 0.5)
float leftsliderEndval=sSelectedRangeLeft;//0.5(value between 0 and 0.5)
float leftsliderDelta=leftsliderEndval-leftsliderStartval;
if(sCurrentGLControl==1)
{
if ( vTexCoord.x <=1.0 && vTexCoord.x > 1.0 -rightsliderDelta)
{
vec4 colorLeft=texture2D (sTexture_2, vec2(vTexCoord.x -(1.0-rightsliderEndval), vTexCoord.y));
//i want to show this result in a projected view like glcontrol2
gl_FragColor = colorLeft;
}
}
else if(sCurrentGLControl==3)
{
if ( vTexCoord.x <=leftsliderDelta )
{
vec4 colorRight=texture2D (sTexture_2, vec2((vTexCoord.x)+leftsliderStartval, vTexCoord.y+sSelectedRightEndVerticalShift));
//i want to show this result in a projected view like glcontrol2
gl_FragColor = colorRight;
}
}
else if(sCurrentGLControl==2)
{ //Projection works fine
vec2 pos = vTexCoord.xy * 2.0 - 1.0;
float b = 0.3;
float v_scale = (1.0 + b) / (1.0 + b * sqrt(1.0 - pos.x*pos.x));
float u = asin( pos.x ) / 3.1415 + 0.5;
float v = (pos.y * v_scale) * 0.5 + 0.5;
if ( v < 0.0 || v > 1.0 )
discard;
vec3 texColor = texture2D( sTexture_1, vec2(u, v) ).rgb;
gl_FragColor = vec4( texColor.rgb, 1.0 );
}
}");
==================================================================
if (glControl.Name == "glControl1")
{
GL.Viewport(new Rectangle(-glControl.Width, 0, glControl.Width*2.0, glControl.Height));
}
else if (glControl.Name == "glControl2")
{
GL.Viewport(new Rectangle(0, 0, glControl.Width , glControl.Height));
}
else
{
GL.Viewport(new Rectangle(0, 0, glControl.Width*2.0, glControl.Height));
}
【问题讨论】:
标签: c# opengl glsl fragment-shader opentk