Я подгрузил в свою программу 2 шейдера:
Вертексный
#version 120
varying vec2 texcoord;
varying vec4 color;
void main() {
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
texcoord = vec2(gl_MultiTexCoord0);
color = gl_Color;
}
Фрагментный
#version 120
varying vec2 texcoord;
varying vec4 color;
uniform sampler2D texture;
uniform float procent;
void main() {
vec4 original = texture2D(texture, texcoord);
float d = (original.r + original.b + original.g)/3.0;
if (procent < texcoord.y)
gl_FragColor = vec4(d, d, d, color.a);
else
gl_FragColor = original * color;
}
При их компиле выдает 0. При попытке получить ошибку, приложение крашится, и среда даже не показывает исключение. Вот класс шейдера
class ShaderProgram {
private int programID;
public ShaderProgram() {
programID = glCreateProgramObjectARB();
}
public ShaderProgram addFragment(byte[] data) {
return add(data, GL_FRAGMENT_SHADER_ARB);
}
public ShaderProgram addVertex(byte[] data) {
return add(data, GL_VERTEX_SHADER_ARB);
}
public ShaderProgram add(byte[] data, int shaderType) {
int shaderID = glCreateShaderObjectARB(shaderType);
string[] file = Encoding.UTF8.GetString(data).Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
glShaderSourceARB(shaderID, 1, file, null);
glCompileShaderARB(shaderID);
int param;
glGetObjectParameterivARB(shaderID, GL_OBJECT_COMPILE_STATUS_ARB, out param);
if (param == GL_FALSE) {
StringBuilder builder = new StringBuilder();
int hz;
glGetInfoLogARB(shaderID, 99999, out hz, builder);
throw new Exception("Shader compilation error!\n" + builder.ToString());
}
glAttachObjectARB(programID, shaderID);
return this;
}
public ShaderProgram compile() {
glLinkProgramARB(programID);
int link_ok;
glGetProgramiv(programID, GL_LINK_STATUS, out link_ok);
if (link_ok == 0) {
int maxLength;
int length;
glGetProgramiv(programID, GL_INFO_LOG_LENGTH, out maxLength);
StringBuilder builder = new StringBuilder();
glGetProgramInfoLog(programID, maxLength, out length, builder);
throw new Exception(builder.ToString());
}
return this;
}
public void start() {
glUseProgramObjectARB(programID);
}
public void stop() {
glUseProgramObjectARB(0);
}
public int getUniform(String name) {
return glGetUniformLocationARB(programID, name);
}
}
Вот как я создаю свой шейдер
public static ShaderProgram whiteColored;
public static void RegisterShaders() {
whiteColored = new ShaderProgram()
.addVertex(Properties.Resources.texture_color)
.addFragment(Properties.Resources.white_colored)
.compile();
}
При вызове glGetInfoLogARB
приложение крашится, поэтому не могу понять в чем проблема. Сам файл шейдеров читается нормально. Если оставить во фрагментном шейдере только установку цвета - gl_FragColor = vec4(1.0,0.0,0.0,1.0);
, то он будет работать
Что бы решить проблему, надо в glShaderSourceARB
в качестве параметра надо передавать не массив из строчек, а одну единую строчку с разделителем \r\n
(он установится автоматически, если вы будете считывать строчки с файла). Так же надо указать длину строки. Вот как я начал вызывать glShaderSourceARB
:
string file = Encoding.UTF8.GetString(data);
int lenght = Encoding.UTF8.GetString(data).Length;
glShaderSourceARB(shaderID, 1, new string[] { file }, ref lenght);
Есть 2 разных dataGridView, можно ли что бы они содержали одинаковые имена колонок?
Описание проблемы: подключаюсь через RDP к удаленному серверу, на этом сервере запускаю студию Visula Studio 2015, запускаю отладчик и при каждой остановки...
Нужен генератор документации в проекте AspNet
Есть приложение WinForms + entity-framework + MS SQLЕсли задать всю строку подключения в app