2017-12-13 6 views
1

저는 SharpGL을 사용하는 WPF 앱에서 디지털 지형 모델의 정점을 채색하는 방법을 개발해 왔습니다. 내가 직면 한 문제는 활성 OpenGL 인스턴스에 첨부 된 TexParameter 메서드를 사용하여 GL_REPEAT 이외의 GL_TEXTURE_WRAP_T 및 S 매개 변수를 변경할 수없는 것입니다.C#에서 OpenGL을 사용하여 텍스처 둘러싸 기 매개 변수를 설정할 수없는 이유는 무엇입니까? (SharpGL dll)

질감 줄 바꿈을 GL_CLAMP_TO_EDGE로 설정할 수없는 경우 가장 낮은 색상에 액세스 할 때 가장 높은 색상의 블리드를 얻을 수 있는데, 절반 정도 픽셀만큼 텍스처 좌표를 오프셋하지 않으면됩니다. 작업).

창은 현재이 같은 렌더링 :

Current wrong result

는 아래 세 번째에있는 최고 셋째, 파랑에서 빨강 색과 중간 세 번째 무지개가 있어야합니다.

텍스쳐의 GL_TEXTURE_MIN_FILTER 및 GL_TEXTURE_MAG_FILTER 매개 변수를 성공적으로 조작 할 수 있기 때문에 TexParameter 메소드를 올바르게 사용하고 있음을 알고 있습니다. 내가 생각할 수있는 유일한 점은 OpenGL 인스턴스에서 텍스처 래핑 매개 변수를 변경할 수 있어야하는 것이 필요하다는 것입니다.

전 C# 테스트 코드와 WPF xaml 코드를 첨부하여 문제를 재현 할 수 있습니다. 52 번째 줄과 53 번째 줄은 메서드가 호출되는 곳입니다. 내가 얻을 수있는 도움은 대단히 감사하겠습니다.

using SharpGL; 
using System.Windows; 
using System.Drawing; 
using SharpGL.SceneGraph.Assets; 

namespace WpfApplication3 
{ 
    public partial class MainWindow : Window 
    { 
     Bitmap bitmap; 
     Texture texture; 

     public MainWindow() 
     { 
      InitializeComponent(); 

      //Create a 5-pixel wide bitmap to be used as the texture 
      bitmap = new Bitmap(5, 1); 
      bitmap.SetPixel(0, 0, Color.Red); 
      bitmap.SetPixel(1, 0, Color.Yellow); 
      bitmap.SetPixel(2, 0, Color.Green); 
      bitmap.SetPixel(3, 0, Color.Cyan); 
      bitmap.SetPixel(4, 0, Color.Blue); 
     } 

     private void GLDraw(object sender, SharpGL.SceneGraph.OpenGLEventArgs args) 
     { 
      OpenGL gl = args.OpenGL; 

      // Clear the color and depth buffers. 
      gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT); 

      //Set an ortho projection to be able to see the entire square 
      gl.MatrixMode(OpenGL.GL_PROJECTION); 
      gl.LoadIdentity(); 
      gl.Ortho(-2, 2, -2, 2, -2, 2); 

      gl.MatrixMode(OpenGL.GL_MODELVIEW); 

      // Reset the modelview. 
      gl.LoadIdentity(); 

      texture.Bind(gl); 

      gl.Enable(OpenGL.GL_TEXTURE_2D); 

      gl.TexParameter(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_WRAP_T, OpenGL.GL_CLAMP_TO_EDGE); 
      gl.TexParameter(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_WRAP_S, OpenGL.GL_CLAMP_TO_EDGE); 
      //gl.TexParameter(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_MIN_FILTER, OpenGL.GL_NEAREST); 
      //gl.TexParameter(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_MAG_FILTER, OpenGL.GL_NEAREST); 

      //Draw the square 
      gl.Begin(OpenGL.GL_QUADS); 

      gl.Color(1.0f, 1.0f, 1.0f, 1.0f); 

      //Texture coordinate outside of 0-1 range to test wrapping method 
      gl.TexCoord(-1, 0.5); 
      gl.Vertex(1.0f, 1.0f, 1.0f); 
      gl.Vertex(-1.0f, 1.0f, 1.0f); 
      //Texture coordinate outside of 0-1 range to test wrapping method 
      gl.TexCoord(2, 0.5); 
      gl.Vertex(-1.0f, -1.0f, 1.0f); 
      gl.Vertex(1.0f, -1.0f, 1.0f); 

      gl.End(); 

      gl.Disable(OpenGL.GL_TEXTURE_2D); 

      // Flush OpenGL. 
      gl.Flush(); 
     } 

     private void GLInitialize(object sender, SharpGL.SceneGraph.OpenGLEventArgs args) 
     { 
      OpenGL gl = args.OpenGL; 
      gl.Enable(OpenGL.GL_DEPTH_TEST); 
      gl.ClearColor(0.0f, 0.0f, 0.0f, 1.0f); 

      texture = new Texture(); 
      texture.Create(gl, bitmap); 
     } 
    } 
} 

다음은 XAML 코드입니다 :

<Window x:Class="WpfApplication3.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:WpfApplication3" 
     xmlns:sharpGL="clr-namespace:SharpGL.WPF;assembly=SharpGL.WPF" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <sharpGL:OpenGLControl OpenGLVersion="OpenGL3_2" OpenGLDraw="GLDraw" OpenGLInitialized="GLInitialize" Cursor="Cross" 
           Background="Transparent"/> 
    </Grid> 
</Window> 

답변

0

내가 답을 발견했다. 나는 텍스처 래핑을 위해 "GL_CLAMP_TO_EDGE"를 지원하지 않는 OpenGL 버전을 사용하고 있었고 코드는 간단하게 "GL_CLAMP"로 변경 한 후에 작동했습니다.

편집 : 답변이 있지만 불완전한 답변을 발견했습니다.

+0

동등하지 않습니다. 그래서 다른 이름이 있습니다. 'GL_CLAMP'는 경계 텍셀을 클램핑한다. 'GL_CLAMP_TO_EDGE'는 텍스처의 가장자리를 고정시킵니다. –

+0

GL_CLAMP_TO_EDGE를 사용하면 아무 일도하지 않았고 GL_CLAMP_TO_BORDER도 사용하지 않았습니다. 나는 경계에 클램핑을하여 외부 0-1 범위 텍스처 좌표를 프리셋 컬러로 설정했다고 생각 했습니까? –

+0

"클램프를 테두리 * 텍셀 *"이라고 말했습니다. GL 1.1 일전에 텍스쳐에는 "경계 텍셀"이라는 개념이있었습니다. 텍스쳐에는 가장자리에 여분의 픽셀을 줄 수 있는데, 이는'GL_CLAMP'를 사용하는 경우에만 샘플링됩니다. 즉, 단일 테두리 색상 (GL_CLAMP_TO_BORDER가하는 것) 또는 텍스처 가장자리에 고정하는 것 (GL_CLAMP_TO_EDGE가하는 것)보다 샘플링 지점에서 가장 가까운 경계 텍셀을 클램프합니다. 그래서 그들은 동등하지 않습니다. –

관련 문제