亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在openGL控件上平均顯示三個紋理 - OpenTK C#

在openGL控件上平均顯示三個紋理 - OpenTK C#

C#
一只萌萌小番薯 2022-10-23 15:36:21
我有三個紋理應該顯示在 opengl 控件上,而這三個紋理應該同樣包含在其中。意味著 texture1 應該在 glcontrol 的 0 到 0.33 之間。并且texture2 應該在0.33 到0.66 和texture3 中保持原位。我已經完成了如下操作。但中間圖像的右側部分區域模糊。請幫忙改正   private void CreateShaders()    {        /***********Vert Shader********************/        vertShader = GL.CreateShader(ShaderType.VertexShader);        GL.ShaderSource(vertShader, @"attribute vec3 a_position;                                    varying vec2 vTexCoordIn;          void main() {            vTexCoordIn=( a_position.xy+1)/2 ;                                             gl_Position = vec4(a_position,1);          }");           GL.CompileShader(vertShader);        /***********Frag Shader ****************/        fragShader = GL.CreateShader(ShaderType.FragmentShader);        GL.ShaderSource(fragShader, @"    uniform sampler2D sTexture1;    uniform sampler2D sTexture2;    uniform sampler2D sTexture3;         varying vec2 vTexCoordIn;    void main ()    {                                                   vec2 vTexCoord=vec2(vTexCoordIn.x,vTexCoordIn.y);    if ( vTexCoord.x<0.3 )    gl_FragColor = texture2D (sTexture1, vec2(vTexCoord.x*2.0, vTexCoord.y));    else if ( vTexCoord.x>=0.3 && vTexCoord.x<=0.6 )    gl_FragColor = texture2D (sTexture2, vec2(vTexCoord.x*2.0, vTexCoord.y));    else    gl_FragColor = texture2D (sTexture3, vec2(vTexCoord.x*2.0, vTexCoord.y)); }");        GL.CompileShader(fragShader);    }
查看完整描述

2 回答

?
鴻蒙傳說

TA貢獻1865條經驗 獲得超7個贊

意味著 texture1 應該在 glcontrol 的 0 到 0.33 之間。并且texture2 應該在0.33 到0.66 和texture3 中保持原位。

如果紋理坐標在 [0, 0.33] 范圍內,則sTexture1必須繪制并且紋理坐標必須從 [0, 0.33] 映射到 [0, 1]:

if ( vTexCoord.x < 1.0/3.0 )
    gl_FragColor = texture2D(sTexture1, vec2(vTexCoord.x * 3.0, vTexCoord.y));

如果紋理坐標在 [0.33, 0.66] 范圍內,則sTexture2必須繪制并且紋理坐標必須從 [0.33, 0.66] 映射到 [0, 1]:

else if ( vTexCoord.x >= 1.0/3.0 && vTexCoord.x < 2.0/3.0 )
    gl_FragColor = texture2D(sTexture2, vec2(vTexCoord.x * 3.0 - 1.0, vTexCoord.y));

f 紋理坐標在 [0.66, 1] 范圍內,然后sTexture3必須繪制并且紋理坐標必須從 [0.66, 1] 映射到 [0, 1]:

else if ( vTexCoord.x >= 2.0/3.0 )
    gl_FragColor = texture2D(sTexture2, vec2(vTexCoord.x * 3.0 - 2.0, vTexCoord.y));


查看完整回答
反對 回復 2022-10-23
?
蠱毒傳說

TA貢獻1895條經驗 獲得超3個贊

gl_FragColor = texture2D (sTexture3, vec2(vTexCoord.x*2.0, vTexCoord.y));
                                                     ^^^^

如果 x >= 0.5,將 x 坐標乘以 2.0 會導致值超過 1.0。如果您的采樣器設置為 CLAMP_TO_EDGE(似乎是這種情況),這會導致在紋理邊緣重復采樣相同的紋素(這將顯示為您提到的拖尾/模糊)。


查看完整回答
反對 回復 2022-10-23
  • 2 回答
  • 0 關注
  • 163 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號