Компьютерная графика

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Компьютерная графика » Программирование графики и GPU » Цвет вершин полигонов при работе с фреймбуфером.


Цвет вершин полигонов при работе с фреймбуфером.

Сообщений 1 страница 6 из 6

1

У меня такое наблюдение. Может кто знает почему так?
В коде приведенном ниже для правильного отображения цветов необходимо добавить строку кода "glColor3f(1.0, 1.0, 1.0);" (помечена как перемещаемая) от помеченного места и до помеченного места. Если такого кода нет, тогда при рисовании будет использован только цвет который был установлен последним, причем он работает как маска для всех применений цвета выше по коду для текущего фреймбуфера.
Я долго вычислял закономерность и нашел ее, но не пойму почему так.

    FB  := TFrameBuffer.Create(ClientWidth, ClientHeight, depth32);

    FB.bind;
    glClearColor(0.3, 0.3, 0.3, 0.0);
    glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

    glDisable( GL_TEXTURE_2D );
    glBegin ( GL_QUADS );
        glColor3f(1.0, 0.0, 0.0);
        glVertex2f   ( 0, 0 );

        glColor3f(0.0, 1.0, 0.0);
        glVertex2f   ( 10, 0 );

        glColor3f(0.0, 0.0, 1.0);
        glVertex2f   ( 10, 5 );

        glColor3f(0.0, 0.0, 0.0);
        glVertex2f   ( 0, 5 );
    glEnd;                                                // <<<<<<< от сюда
    FB.unbind;

    glEnable( GL_TEXTURE_2D );
    glBindTexture(GL_TEXTURE_2D, FB.GetColorBuffer(0));
    glColor3f(1.0, 1.0, 1.0);                      // перемещаемая строка
                                                             // <<<<<<  до сюда
    glBegin ( GL_QUADS );
        glTexCoord2f ( 0, 0 );
        glVertex2f   ( 0, 0 );

        glTexCoord2f ( 1, 0 );
        glVertex2f   ( 5, 0 );

        glTexCoord2f ( 1, 1 );
        glVertex2f   ( 5, 10 );

        glTexCoord2f ( 0, 1 );
        glVertex2f   ( 0, 10 );
    glEnd;

Если установить белый цвет, то видно два прямоугольника один цветной в другом сером, а серый в окне.
А если не установить белый цвет, тогда цвета картинки будут зависеть от последнего цвета использованного при рисовании во фреймбуфер.
И если последняя вершина будет черного цвета, тогда не видно ничего. Вернее все черного цвета.

0

2

Для второго квада цвет получается путем компбинации цвета в вершинах и цвета из текстуры.
Если стоит режим GL_MODULATE, то эта комбинация будет произвдением (т.е. цвет в вершине будет работать как маска)

0

3

Спасибо, добавление строки

Код:
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

помогло.

0

4

Steps3D
Здравствуйте.
  Не подскажете где я мог чего упустить.
  Я шейдером рисую во фреймбуфер четыре точки разного цвета. (Потом это будут координаты вершин).
  Потом я считываю в TmpBuf что получилось (числа как то более понятно чем цвета) и следом рисую квадратик используя фрейбуфер как текстуру.
 
  В OpenGL 2.1 В режиме GL_TEXTURE_2D я вижу квадртик состоящий из 4 разноцветных квадратиков (как и ожидалось).
  В OpenGL 3.2 В режиме GL_TEXTURE_2D я вижу квадртик с плавными переходами цветов, цвета переходят как повертикали так и по горизонтали.
  В OpenGL 3.2 В режиме GL_TEXTURE_RECTANGLE я вижу квадртик одного цвета.
  Во всех случаях в TmpBuf числа похожие на правду и они меняются в зависимости от входных данных, но квадратик в GL_TEXTURE_RECTANGLE всегда однотонный (темно-желтый).
 
 
  GlslProgram.bind;
  GlslProgram.setTexture ( 'TextureVertex',  0 );
  FrameBuffer.bind;
  startOrtho(2, 2);
  drawQuadsRect(2, 2);
  endOrtho;
  GlslProgram.unbind;

  SetLength(TmpBuf, FrameBuffer.getWidth * FrameBuffer.getHeight * 4 );
  glReadPixels ( 0, 0, FB.getWidth, FB.getHeight , GL_RGBA, GL_FLOAT, TmpBuf );

  DrawQuads(...);

0

5

Насчет 2.1 - 3.2 м.б. дело в режиме фильтрации - попробуйте я\вно поставить GL_NEAREST

0

6

Steps3D
Здравствуйте.
Я создаю текстуры с такими настройками:

Код:
  glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP ); 
  glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP );
  glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
  glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );

Я и когда рисовал просто квадратики с различными цветами вершин замечал, что на 2 и 3 контексте квадратик закрашен по разному (переход цвета выглядит по другому). Но я думал, что это зависит от того по какой оси выполняется первый шаг дискретизации при расчете цвета. А сейчас когда расчет делает шейдер написанный мной, я подумал может я чего не делаю из того, что делает OpenGL не заметно для пользователя.

0


Вы здесь » Компьютерная графика » Программирование графики и GPU » Цвет вершин полигонов при работе с фреймбуфером.


создать форум