2013-07-30 3 views
2

Предположим, у меня возникла такая проблема: теперь у меня есть фреймбуфер, а текстура содержит только один компонент цвета (например, GL_RED), который уже привязан к нему. Как выглядит фрагмент шейдера? Я предполагаю, что ответ:Тип вывода шейдера фрагмента GLSL

... out float ex_color;

ex_color = ...;

Вот мой вопрос: будет ли шейдер автоматически определять формат фреймбуфера и записывать в него значения? Что делать, если фрагментарный шейдер выводит значения с плавающей точкой, а формат фреймбуфера - GL_RGBA?

Кстати, какой правильный подход к созданию текстуры имеет только один компонент? Я читал примеры из g-truc, который имеет такой пример:

glTexImage2D (GL_TEXTURE_2D, 0, GL_RED, GLsizei (Texture.dimensions(). X), GLsizei (Texture.dimensions(). Y), 0, GL_RGB, GL_UNSIGNED_BYTE, 0);

В чем смысл назначения GL_RGB в качестве формата данных пикселей?

+0

Я не думаю, что 'GL_RED' является допустимым внутренним форматом. Вам нужен внутренний формат реального размера (скорее всего, 'GL_R8'). –

+0

Так вот где я в замешательстве. Но ведь этот образец работает хорошо, когда я запускаю его. И можете ли вы подробнее объяснить внутренний формат, формат и тип функции glTexImage2D? – user2310794

+0

* «Так вот где я в замешательстве». * - Это не единственное, на что вы действительно смущены. Но у меня нет времени придумать хорошее широкомасштабное объяснение всего этого на данный момент, поэтому я надеюсь, что Nicol Bolas *, * datenwolf * или кто-то еще, чтобы вскочить и дать реальный ответ всем эти вопросы. –

ответ

5

Точно так же, как vertex shader inputs не должны совпадать с точным размером данных, указанных glVertexAttribPointer, fragment shader outputs не должны совпадать с точным размером изображения, в котором они записываются. Если на выходе представлено больше компонентов, чем формат целевого изображения, то дополнительные компоненты игнорируются. Если он предоставляет меньше, то другие компоненты имеют неопределенные значения (в отличие от входов вершин, где неопределенные значения имеют четко определенные значения).

В чем смысл назначения GL_RGB в качестве формата данных пикселей?

Это pixel transfer format. Это описывает формат пикселей, который вы предоставляете OpenGL, а не тот формат, который OpenGL сохранит.

Вы всегда должны использовать sized internal formats, а не несезонные, такие как GL_RED.

+0

Итак, параметр «внутренний формат» функции glTexImage2D указывает, как цветовые компоненты хранятся в памяти, а параметр «format» указывает только порядок компонентов, выбранных из пользовательской памяти? Могу ли я считать, что OpenGL всегда хранит цвета во «внутреннем формате», и вы можете сказать Opengl, как интерпретировать данные и копировать их в память, указав формат передачи пикселей? – user2310794

+0

@ user2310794: «OpenGL всегда хранит цвета в четырех компонентах». Текстуры хранят то, что вы им сообщаете, чтобы хранить. –

+0

Да, это ошибка, сделанная мной ... Мне очень ясно, большое спасибо! – user2310794

3

Для достойного объяснения внутреннего формата и формата, см:

http://opengl.org/wiki/Image_Format и http://opengl.org/sdk/docs/man/xhtml/glTexImage2D.xml.

Вы в основном хотите формат GL_RED и хотите, чтобы GL_R8 (беззнаковая нормализованная 8-битная фиксированная точка) для внутреннего формата.

Давным-давно, текстуры яркости были нормой для одноканальных, но это устаревший формат в современном GL и красный, теперь это логичный «растяжимый» формат текстуры для одноканальных каналов, так же как красный/зеленый наиболее логичный формат для двухканального.

Что касается вашего шейдера, существуют правила для расширения компонентов, определенные базовой спецификацией. Если у вас есть текстура с 1 каналом в качестве входа, но пример ее как vec4, она будет эквивалентна: vec4 (RED, 0.0, 0.0, 1.0).

Написание текстуры немного отличается. .

С OpenGL 4.4 Spec, раздел 15.2 (Shader Execution), стр 262 - http://www.opengl.org/registry/doc/glspec44.core.pdf

When a fragment shader terminates, the value of each active user-defined output variable is written to components of the fragment color output to which it is bound. The set of fragment color components written is determined according to the variable’s data type and component index binding, using the mappings in table 11.1 [pp. 340].

По умолчанию, если выход вашего пиксельный шейдер является поплавок, он собирается написать x (красный) компонент вашей текстуры. Вы можете использовать спецификатор макета (например, layout (component = 1) out float color,), чтобы указать, что он должен писать y (зеленый), z (синий) или w (альфа) (при условии, что у вас есть текстура RGBA) ,

Смежные вопросы