Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > шейдеры в opengl


Автор: nathmorp 30.11.2013, 07:34
Привет всем!!! я новичок в компьютерной графике. Пытаюсь выполнить одно задание с использованием шейдеров. Необходимо создать квадрат из плоских примитивов, также управлять его движением с клавиатуры----с этим проблем небыло, но вот вторая часть вызвала не понимание...нужно чтобы цвет квадрата из примитивов был более светлым к центру, а к краям более темным: необходимо использовать шейдеры.... и тут есть непонимание...как именно использовать...может текстуру или освешение... но при освешении при удалении от источника света отражение на квадрате тоже будет меняться мне этого не нужно... Посоветуйте от чего мне нужно отталкиваться. Буду признательна за любой совет.Нат smile 

Автор: Amp 30.11.2013, 13:16
Передаешь в шейдер координаты центра квадрата и размер его стороны (проще сразу в оконных координатах). Во фрагментном шейдере вычисляешь расстояние от этого центра до позиции текущего фрагмента (distance). Делишь это расстояние на половину размера квадрата, т.е. приводишь к диапазону от 0.0 до 1.0 (не забывая про clamp, чтобы не было > 1.0 в углах). Далее вычисляешь цвет фрагмента на основе двух цветов (центра и грая) с помощью функции mix и пишешь его  в gl_FragColor. Будет в итоге радиальный градиент. Цвета центра и края можешь либо сразу передавать в шейдер, либо считать их на основе gl_Color (делая темнее и светлее).

Автор: nathmorp 1.12.2013, 08:33
привет, наверно я где-то недопоняла...но пока не получается.  Подскажите пожалуйста на что нужно обратить внимание
Код

const GLchar* FshaderSrc[] = {
     "uniform vec3 center;"
     "uniform float len;"
     "varying vec3 vertex_pos;"
        "float dist;"  
        "void main(){"

        "dist = distance(center,vertex_pos);"
        "float l=len/2.0;"
        "float t =clamp(dist/l, 0.0, 1.0);"
        "gl_FragColor = vec4(mix((1.0,1.0,1.0),(0.0,0.0,0.0), t )); "

        "}" 



Автор: Amp 1.12.2013, 12:02
center имеет смысл делать vec2, так как z координата не нужна, вместо vertex_pos бери gl_FragCoord.xy. Теперь главное - вся свистопляска происходит в оконных координатах, поэтому center и len тоже должны быть в них же. Следует также учесть, что на значения center и len будет влиять modelview-матрица, поэтому для простоты проекцию лучше делать ортографической в координатах окна.

Автор: tzirechnoy 4.12.2013, 17:54
Мне, например, неясно -- зачем здесь использовать шэйдэры, учитывая, что в такой постановке задача делается одной текстурой 2x2.

Автор: Bitter 4.12.2013, 18:50
tzirechnoy, ну задание такое, видимо для изучения шейдеров. А как их еще изучить если не писать простые примеры?

Автор: tzirechnoy 7.12.2013, 00:05
Тут два момента. Во-первых, мне неочевидно, что в задаче надо именно на шэйдэрах -- а не топикстартер это придумал, поскольку слово какое-то похожэе на требования.

Во-вторых, изучать их, разумеется, надо на простых примерах, в которых нужны шэйдэры. Ну, вторую текстуру натянуть или например осветить не по Фонгу.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)