저는 SharpGL을 사용하는 WPF 앱에서 디지털 지형 모델의 정점을 채색하는 방법을 개발해 왔습니다. 내가 직면 한 문제는 활성 OpenGL 인스턴스에 첨부 된 TexParameter 메서드를 사용하여 GL_REPEAT 이외의 GL_TEXTURE_WRAP_T 및 S 매개 변수를 변경할 수없는 것입니다.C#에서 OpenGL을 사용하여 텍스처 둘러싸 기 매개 변수를 설정할 수없는 이유는 무엇입니까? (SharpGL dll)
질감 줄 바꿈을 GL_CLAMP_TO_EDGE로 설정할 수없는 경우 가장 낮은 색상에 액세스 할 때 가장 높은 색상의 블리드를 얻을 수 있는데, 절반 정도 픽셀만큼 텍스처 좌표를 오프셋하지 않으면됩니다. 작업).
는창은 현재이 같은 렌더링 :
는 아래 세 번째에있는 최고 셋째, 파랑에서 빨강 색과 중간 세 번째 무지개가 있어야합니다.
텍스쳐의 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>
동등하지 않습니다. 그래서 다른 이름이 있습니다. 'GL_CLAMP'는 경계 텍셀을 클램핑한다. 'GL_CLAMP_TO_EDGE'는 텍스처의 가장자리를 고정시킵니다. –
GL_CLAMP_TO_EDGE를 사용하면 아무 일도하지 않았고 GL_CLAMP_TO_BORDER도 사용하지 않았습니다. 나는 경계에 클램핑을하여 외부 0-1 범위 텍스처 좌표를 프리셋 컬러로 설정했다고 생각 했습니까? –
"클램프를 테두리 * 텍셀 *"이라고 말했습니다. GL 1.1 일전에 텍스쳐에는 "경계 텍셀"이라는 개념이있었습니다. 텍스쳐에는 가장자리에 여분의 픽셀을 줄 수 있는데, 이는'GL_CLAMP'를 사용하는 경우에만 샘플링됩니다. 즉, 단일 테두리 색상 (GL_CLAMP_TO_BORDER가하는 것) 또는 텍스처 가장자리에 고정하는 것 (GL_CLAMP_TO_EDGE가하는 것)보다 샘플링 지점에서 가장 가까운 경계 텍셀을 클램프합니다. 그래서 그들은 동등하지 않습니다. –