X512
А в чём там разница? Я просто слышал, что он в промежуточный код компилит. Но сам на нём ничего почти не писал, поэтому не в курсе подробностей. :)
у меня получается черный объект. Уважаемый K.V. а вы на C# делаете? С# - потому что начал работать на нем. Но чувствую сейчас буду переходить на Qt, чтобы заработали шейдеры.
K.V.
> Я просто слышал, что он в промежуточный код компилит.
А потом ещё и в байт код динамичеки компилит(бредовая схема, если можно сразу в байт код компилить).
altk
А ничего вроди glColor3f(0,0,0) не было?
Не, я на C++. А Qt это оконная библиотека, это же не язык программирования. Для графики тебе будет достаточно C++ и нескольких десятков строк на WinAPI, а насчёт Qt не знаю, стоит ли... Хотя слышал о нём хвалебные отзывы. Хотя бы потому что он кроссплатформенный.
X512
Мудрёная система. :) А насчёт glColor3f, шейдер разве не должен заменить собой эту часть конвейера? O_o Я конечно не уверен, но по-моему glColor ему должно быть безразлично. :)
K.V.
> Хотя бы потому что он кроссплатформенный.
Кто мешает исрользовать SDL?
Нет. А вот пример, который даёт красный объект:
private string[] vertex_shader = { "varying vec4 color2;", "void main() {", "color2=vec4(1.0,1.0,0.0,1.0);", "gl_Position = ftransform();", "}" }; private string[] fragment_shader = { "varying vec4 color2; void main(){color2=vec4(1.0,0.0,0.0,1.0); gl_FragColor=color2;}" };
Результат красный объект.
private string[] vertex_shader = { "varying vec4 color2;", "varying vec3 normal,lightDir,halfVector;", */ "void main() {", "color2=vec4(1.0,1.0,0.0,1.0);", "gl_Position = ftransform();", "}" }; private string[] fragment_shader = { "varying vec4 color2; void main(){gl_FragColor=color2;}" };
Результат - черный объект. Вот теперь где ошибка?
X512
> Кто мешает исрользовать SDL?
А не знаю, я насчёт кроссплатформенности пока не особо парюсь, и не изучал эту тему. :)
А переходить на Qt - потому что уже пробовал свои силы в данной библиотеке, да и портирование программы думаю займет около дня, если не меньше.
altk
> Результат красный объект.
А должен быть жёлтый. :)
Вообще странно, почему первый пример вообще работает. Я до этого считал, что нельзя во фрагментном шейдере устанавливать значение varying-переменных. А второй у тебя везде не работает? В RenderMonkey проверял?
Render Monkty у меня не запускается - я так понимаю из-за Vista. Проверял у парня на ноуте - Render Monkey всё работает замечательно.
Ну значит дело не в шейдере. И вот, кстати, из учебника:
"Обычно вершинный шейдер устанавливает varying-переменную, а фрагментный шейдер её использует, не имея возможности изменить значение". Не знаю как у тебя это работает (пример с красным объектом), но теоретически это некорректно. :)
Я только сейчас подробно глянул твоё API. Какой кошмар!!! Ты зачем так делаешь? :) Поэтому ничего толком и не работает. Щас распишу как надо.
private void InitShaders()
{
// создаём объект вершинного шейдера
vs_object = Gl.glCreateShader(Gl.GL_VERTEX_SHADER);
// создаём объект фрагментного шейдера
fs_object = Gl.glCreateShader(Gl.GL_FRAGMENT_SHADER);
int[] status = new int[1];
// компилим шейдеры и проверяем на наличие ошибок. в том примере, на основе которого я загружал шейдеры,
// использовалась функция glGetObjectParameteriv вместо glGetShaderiv, но не знаю насколько это принципиально.
Gl.glShaderSource(vs_object, vertex_shader.Length, vertex_shader, null);
Gl.glCompileShader(vs_object);
Gl.glGetObjectParameteriv(vs_object, Gl.GL_COMPILE_STATUS, status);
if (status[0] != Gl.GL_TRUE)
throw new Exception("Could not compile fragment shader");
Gl.glShaderSource(fs_object, fragment_shader.Length, fragment_shader, null);
Gl.glCompileShader(fs_object);
Gl.glGetObjectParameteriv(fs_object, Gl.GL_COMPILE_STATUS, status);
if (status[0] != Gl.GL_TRUE)
throw new Exception("Could not compile fragment shader");
// А вот программа тебе нужна всего одна, она и будет объединять эти два шейдера.
program = Gl.glCreateProgram();
Gl.glAttachShader(program, vs_object);
Gl.glAttachShader(program, fs_object);
// Теперь выполняем компоновку (примерно то же, что Build в компиляторе)
Gl.glLinkProgram(program);
// Тут можешь тоже проверить на успешность компоновки, иногда она выдаёт ошибки.
// Только константа тут будет GL_OBJECT_LINK_STATUS_ARB и проверять надо будет объект program.
//System.Diagnostics.Debug.WriteLine(string.Format("program={0}", fs_program));
}
Вот примерно так. И потом где нужно использовать шейдер пишешь
Gl.glUseProgramObject(program);
А где не нужно
Gl.glUseProgramObject(0);
А закомментированная строка с System уж не знаю зачем, тебе виднее. :)
Тема в архиве.
Тема закрыта.