-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathShader.cs
150 lines (114 loc) · 4.09 KB
/
Shader.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Permissions;
using System.Text;
using System.Threading.Tasks;
using OpenTK;
using OpenTK.Graphics.OpenGL;
namespace Core.OpenGLShader
{
public class Shader : IDisposable
{
public Shader()
{
}
public static string ComposeShaderCode(List<Tuple<string, string>> defines, string originalCode)
{
string defineString = "";
if (defines != null)
{
foreach (var define in defines)
{
defineString += $"#define {define.Item1} {define.Item2}\n";
}
}
var codes = originalCode.Split(Environment.NewLine, StringSplitOptions.RemoveEmptyEntries);
bool versionCodeExist = codes.Where(x => x.StartsWith("#version")).Count() > 0;
string composedSourceCode = (versionCodeExist ? "" : VersionString) + defineString + originalCode;
return composedSourceCode;
}
public void Dispose()
{
GL.DeleteShader(shaderObject);
shaderObject = -1;
}
public bool CompileShader(string ShaderSourceCode)
{
string ShaderErrLog = "";
bool bSuccess = CompileShader(ShaderSourceCode, out ShaderErrLog);
if (bSuccess == false)
{
Console.WriteLine(ShaderErrLog);
}
return bSuccess;
}
public void CompileShader(string shaderSourceCode, List<Tuple<string, string>> defines)
{
string ShaderErrLog = "";
bool bSuccess = CompileShader(shaderSourceCode, defines, out ShaderErrLog);
if (bSuccess == false)
{
Console.WriteLine(ShaderErrLog);
}
}
public bool CompileShader(string[] shaderSourceCodes, out string errorlog)
{
int [] LengthList = new int[shaderSourceCodes.Length];
for (int i = 0; i < shaderSourceCodes.Length; ++i)
{
LengthList[i] = shaderSourceCodes[i].Length;
}
GL.ShaderSource(shaderObject, shaderSourceCodes.Length, shaderSourceCodes, LengthList);
GL.CompileShader(shaderObject);
errorlog = string.Empty;
int nStatus;
GL.GetShader(shaderObject, ShaderParameter.CompileStatus, out nStatus);
if (nStatus != 1)
{
GL.GetShaderInfoLog(shaderObject, out errorlog);
return false;
}
return true;
}
public bool CompileShader(string shaderSourceCode, List<Tuple<string, string>> defines, out string errorLog)
{
string modifiedSourceCode = ComposeShaderCode(defines, shaderSourceCode);
GL.ShaderSource(shaderObject, modifiedSourceCode);
GL.CompileShader(shaderObject);
errorLog = string.Empty;
int nStatus;
GL.GetShader(shaderObject, ShaderParameter.CompileStatus, out nStatus);
if (nStatus != 1)
{
GL.GetShaderInfoLog(shaderObject, out errorLog);
return false;
}
return true;
}
public bool CompileShader(string shaderSourceCode, out string errorlog)
{
GL.ShaderSource(shaderObject, shaderSourceCode);
GL.CompileShader(shaderObject);
errorlog = string.Empty;
int nStatus;
GL.GetShader(shaderObject, ShaderParameter.CompileStatus, out nStatus);
if (nStatus != 1)
{
GL.GetShaderInfoLog(shaderObject, out errorlog);
return false;
}
return true;
}
public int ShaderObject
{
get { return shaderObject; }
protected set
{
shaderObject = value;
}
}
private int shaderObject = -1;
public static string VersionString = "#version 450 core\n";
}
}