Wenn Sie Shader mit Openentk in WPF verwenden, wird die Zeichnung nicht reflektiertC#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Wenn Sie Shader mit Openentk in WPF verwenden, wird die Zeichnung nicht reflektiert

Post by Anonymous »

contentControl wird in wpf.
Das ContentControl erstellt. funktioniert.

Code: Select all

using WpfApp1.Models;
using OpenTK.Graphics.OpenGL;
using OpenTK.Mathematics;
using OpenTK.Wpf;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;

namespace WpfApp1.Controls;

public class BottomTextContentControl : ContentControl
{

public BottomTextContentControl()
{
var setting = new GLWpfControlSettings()
{
MajorVersion = 2,
MinorVersion = 1,
};
this._glwpfControl.Start(setting);
this._glwpfControl.Render += OnGlRender;

_mainPanel = new DockPanel();

_textBlock = new TextBlock
{
FontStyle = FontStyles.Italic,
Margin = new Thickness(5),
Foreground = Brushes.Gray
};

DockPanel.SetDock(_textBlock, Dock.Top);
_mainPanel.Children.Add(_textBlock);
_mainPanel.Children.Add(_glwpfControl);

this.Content = _mainPanel;
}

private void OnGlRender(TimeSpan delta)
{
if (Shader.Program == 0)
{
Shader.CreateShaderProgram();
InitializeBuffers();
}

GL.ClearColor(System.Drawing.Color.Pink);
GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);

SetProjection();

RenderSquare();

}

private void SetProjection()
{
Thickness margin = new Thickness(5, 5, 5, 5);
var xend = (int)_glwpfControl.ActualWidth - margin.Left - margin.Right;
var yend = (int)_glwpfControl.ActualHeight - margin.Bottom - margin.Top;

GL.Viewport((int)margin.Left, (int)margin.Bottom, (int)xend, (int)yend);

var m = Matrix4.Identity;
Shader.RegisterMatrix(m);

}

private void RenderSquare()
{
GL.BindVertexArray(_vao);
GL.DrawArrays(PrimitiveType.Quads, 0, 4);
}

private void InitializeBuffers()
{
double[] vertices = {
-1.0f, -1.0f, // 左下
1.0f, -1.0f, // 右下
1.0f,  1.0f, // 右上
-1.0f,  1.0f  // 左上
};

float[] colors = {
1.0f, 0.0f, 0.0f, 1.0f, // 赤
0.0f, 1.0f, 0.0f, 1.0f, // 緑
0.0f, 0.0f, 1.0f, 1.0f, // 青
1.0f, 1.0f, 1.0f, 1.0f  // 白
};

_vao = GL.GenVertexArray();

int[] buffers = new int[2];
GL.GenBuffers(2, buffers);
int positionVbo = buffers[0];
int colorVbo = buffers[1];

Shader.RegisterVertex(_vao, positionVbo, vertices, colors);
}

private TextBlock _textBlock;
private Panel _mainPanel;

private int _vao;

private GLWpfControl _glwpfControl = new GLWpfControl();

}

< /code>
und die folgende Quelle ist die Klasse für die Verwendung von Shader.  < /p>
using OpenTK.Graphics.OpenGL;
using OpenTK.Mathematics;
using System.IO;
using System.Runtime.InteropServices;

namespace WpfApp1.Models;

public static class Shader
{
#region 公開メソッド

public static void CreateShaderProgram()
{

// VertexShader
VertexShader = GL.CreateShader(ShaderType.VertexShader);
var sv = new StreamReader("shader.vert");
GL.ShaderSource(VertexShader, sv.ReadToEnd());
GL.CompileShader(VertexShader);
CheckShader(VertexShader);

// FragmentShader
FragmentShader = GL.CreateShader(ShaderType.FragmentShader);
var sf = new StreamReader("shader.frag");
GL.ShaderSource(FragmentShader, sf.ReadToEnd());
GL.CompileShader(FragmentShader);
CheckShader(FragmentShader);

// Program
Program = GL.CreateProgram();
GL.AttachShader(Program, VertexShader);
GL.AttachShader(Program, FragmentShader);

GL.DeleteShader(VertexShader);
GL.DeleteShader(FragmentShader);

GL.LinkProgram(Program);
CheckProgram();

GL.UseProgram(Program);
}

public static void RegisterVertex(int vaoNo, int vboNo, double[] positionVertex, float[] colorVertex)
{
GL.BindVertexArray(vaoNo);

GL.BindBuffer(BufferTarget.ArrayBuffer, vboNo);
Shader.RegisterPositionVertex(positionVertex);

GL.BindBuffer(BufferTarget.ArrayBuffer, vboNo + 1);
Shader.RegisterColorVertex(colorVertex);
}

public static void RegisterPositionVertex(double[] positionData)
{
int size = Marshal.SizeOf(typeof(double)) * positionData.Length;
IntPtr ptr = Marshal.AllocHGlobal(size);
Marshal.Copy(positionData, 0, ptr, positionData.Length);

GL.BufferData(BufferTarget.ArrayBuffer, size, ptr, BufferUsageHint.DynamicDraw);

var attrPosition = GL.GetAttribLocation(Program, "position");
GL.EnableVertexAttribArray(attrPosition);
GL.VertexAttribPointer(attrPosition, 2, VertexAttribPointerType.Double, false, 0, 0);

Marshal.FreeHGlobal(ptr);
}

public static void RegisterColorVertex(float[] colorData)
{
int size = Marshal.SizeOf(typeof(float)) * colorData.Length;
IntPtr ptr = Marshal.AllocHGlobal(size);
Marshal.Copy(colorData, 0, ptr, colorData.Length);

GL.BufferData(BufferTarget.ArrayBuffer, size, ptr, BufferUsageHint.DynamicDraw);

int attrColor = GL.GetAttribLocation(Program, "color");
GL.EnableVertexAttribArray(attrColor);
GL.VertexAttribPointer(attrColor, 4, VertexAttribPointerType.Float, false, 0, 0);

Marshal.FreeHGlobal(ptr);
}

public static void RegisterTextureVertex(float[] textureData)
{
int size = Marshal.SizeOf(typeof(float)) * textureData.Length;
IntPtr ptr = Marshal.AllocHGlobal(size);
Marshal.Copy(textureData, 0, ptr, textureData.Length);

GL.BufferData(BufferTarget.ArrayBuffer, size, ptr, BufferUsageHint.DynamicDraw);

var attrTexture = GL.GetAttribLocation(Program, "textureCoord");
GL.EnableVertexAttribArray(attrTexture);
GL.VertexAttribPointer(attrTexture, 2, VertexAttribPointerType.Float, false, 0, 0);

var uniformTexture = GL.GetUniformLocation(Program, "texture");
GL.Uniform1(uniformTexture, 0);

Marshal.FreeHGlobal(ptr);
}

public static void RegisterMatrix(Matrix4 matrix)
{
var uniLocation = GL.GetUniformLocation(Shader.Program, "location");
GL.UniformMatrix4(uniLocation, false, ref matrix);
}

#endregion 公開メソッド

#region 非公開メソッド

private static void CheckShader(int shader)
{
string info;
int status;

GL.GetShaderInfoLog(shader, out info);
GL.GetShader(VertexShader, ShaderParameter.CompileStatus, out status);
if (status != 1) { throw new Exception(info); }
}

private static void CheckProgram()
{
string info;
int status;

GL.GetProgram(Program, GetProgramParameterName.LinkStatus, out status);
GL.GetProgramInfoLog(Program, out info);
if (status != 1) { throw new Exception(info); }
}

#endregion 非公開メソッド

#region 公開プロパティ

public static int Program { get; private set; }

public static int FragmentShader { get; private set; }

public static int VertexShader { get; private set;  }

#endregion 公開プロパティ

}

< /code>
Und dies sind die Shader -Programme.attribute vec3 position;
attribute vec4 color;
attribute vec2 textureCoord;
uniform   mat4 location;
varying   vec4 vColor;
varying   vec2 vTextureCoord;

void main(void){
vColor        = color;
vTextureCoord = textureCoord;
gl_Position   = location * vec4(position, 1.0);
}
< /code>
Shader.frag
uniform sampler2D texture;
varying vec4      vColor;
varying vec2      vTextureCoord;

void main(void){
vec4 smpColor = texture2D(texture, vTextureCoord);
gl_FragColor  = vColor * smpColor;
}

< /code>
Zeichnung war möglich, wenn der Shader nicht verwendet wurde.
Folgendes ist der Fall ohne Shader.using ContentControlSample.Models;
using OpenTK.Graphics.OpenGL;
using OpenTK.Mathematics;
using OpenTK.Wpf;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using Color = System.Drawing.Color;

namespace ContentControlSample.Controls;

public class BottomTextContentControl : ContentControl
{

public BottomTextContentControl()
{
// OpenGLWpfControl の初期化
var setting = new GLWpfControlSettings()
{
MajorVersion = 2,
MinorVersion = 1,
};
this._glwpfControl.Start(setting);
this._glwpfControl.Render += OnGlRender;

_mainPanel = new DockPanel();

_textBlock = new TextBlock
{
FontStyle = FontStyles.Italic,
Margin = new Thickness(5),
Foreground = Brushes.Gray
};

DockPanel.SetDock(_textBlock, Dock.Top);
_mainPanel.Children.Add(_textBlock);
_mainPanel.Children.Add(_glwpfControl);

this.Content = _mainPanel;
}

private void OnGlRender(TimeSpan delta)
{
InitializeBuffers();

GL.ClearColor(System.Drawing.Color.Black);
GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);

SetProjection();

RenderSquare();

}

private void SetProjection()
{
Thickness margin = new Thickness(5, 5, 5, 5);
var xend = (int)_glwpfControl.ActualWidth - margin.Left - margin.Right;
var yend = (int)_glwpfControl.ActualHeight - margin.Bottom - margin.Top;

// 描画領域を設定
GL.Viewport((int)margin.Left, (int)margin.Bottom, (int)xend, (int)yend);

GL.MatrixMode(MatrixMode.Projection);
var m = Matrix4.Identity;
GL.LoadMatrix(ref m);

}

private void RenderSquare()
{
// VAO をバインド
GL.BindVertexArray(_vao);

// 色を設定
GL.Color3(Color.Pink);

// 描画
GL.DrawArrays(PrimitiveType.Quads, 0, 4);

// バインド解除
GL.BindVertexArray(0);
}

private void InitializeBuffers()
{
// 頂点データ
float[] vertices = {
-1.0f, -1.0f, // 左下
1.0f, -1.0f, // 右下
1.0f,  1.0f, // 右上
-1.0f,  1.0f  // 左上
};

// VAO を生成
_vao = GL.GenVertexArray();
GL.BindVertexArray(_vao);

// VBO を生成
_vbo = GL.GenBuffer();
GL.BindBuffer(BufferTarget.ArrayBuffer, _vbo);
GL.BufferData(BufferTarget.ArrayBuffer, vertices.Length * sizeof(float), vertices, BufferUsageHint.StaticDraw);

// 頂点属性を設定
GL.VertexAttribPointer(0, 2, VertexAttribPointerType.Float, false, 2 * sizeof(float), 0);
GL.EnableVertexAttribArray(0);

// バインド解除
GL.BindBuffer(BufferTarget.ArrayBuffer, 0);
GL.BindVertexArray(0);
}

#region フィールド

private TextBlock _textBlock;
private Panel _mainPanel;

private int _vbo; // 頂点バッファオブジェクトのID
private int _vao; // 頂点配列オブジェクトのID

/// OpenTK 描画用のコントロール
private GLWpfControl _glwpfControl = new GLWpfControl();

#endregion フィールド
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post