Войти
OpenGL communityФорумРазвитие сообщества

Обсуждение дальнейших уроков (9 стр)

Advanced: Тема повышенной сложности или важная.

Страницы: 18 9 10 1114 Следующая »
#120
0:02, 20 ноя. 2010

YarUnderoaker
> Просто между созданием временного контекста и нового определять максимальную версию ОГЛ и её подставлять в атрибуты.

Если примеры написаны под 3.3, то думаю не совсем правильным будет создавать для этого контекст последней версии, так как в контексте последней версии может быть депрекейтед то, что есть в 3.3 версии к примеру... А Крендель если не изменяет память юзает core профиль... Ну вы поняли...

> Чтобы небыло таких фраз.

В контексте 3.3 не может быть поддержки GLSL 4.0, в этом как бы и был лол...


#121
1:04, 20 ноя. 2010

Хм... резонно.
А что на Ферми пишет соответствующую версию GLSL?

#122
6:18, 20 ноя. 2010

YarUnderoaker
> А что на Ферми пишет соответствующую версию GLSL?

Не знаю, Ферми у меня нету...
Скорее всего да, вероятность того, что другой вендор допустит тот же косяк не велика... :)

#123
15:27, 22 ноя. 2010

.\src\OpenGL.cpp:OpenGLPrintDebugInfo:27 DEBUG OpenGL render context information:
  Renderer      : GeForce GTX 480/PCI/SSE2
  Vendor        : NVIDIA Corporation
  Version        : 3.3.0
  GLSL version  : 3.30 NVIDIA via Cg compiler
  OpenGL version : 3.3
.\src\OpenGL.cpp:OpenGLPrintDebugInfo:30 DEBUG GL_MAX_VERTEX_ATTRIBS = 16
.\src\OpenGL.cpp:OpenGLPrintDebugInfo:31 DEBUG GL_MAX_VERTEX_UNIFORM_COMPONENTS = 4096
.\src\OpenGL.cpp:OpenGLPrintDebugInfo:32 DEBUG GL_MAX_TEXTURE_IMAGE_UNITS = 32
.\src\OpenGL.cpp:OpenGLPrintDebugInfo:33 DEBUG GL_MAX_COLOR_ATTACHMENTS = 8
.\src\OpenGL.cpp:OpenGLPrintDebugInfo:34 DEBUG GL_MIN_PROGRAM_TEXEL_OFFSET = -8
.\src\OpenGL.cpp:OpenGLPrintDebugInfo:35 DEBUG GL_MAX_PROGRAM_TEXEL_OFFSET = 7

#124
20:18, 22 ноя. 2010

Криворукие китайские дровописатели :-/

#125
20:33, 22 ноя. 2010

YarUnderoaker
Это ты про НВ? А что не так?

#126
20:21, 24 ноя. 2010

Вопрос про layout'ы. Захотелось через него объявить матрицу

layout(location = 5) uniform mat4 EProjView;

Лог шейдерный выдал мне, что надо использовать расширение GL_ARB_separate_shader_objects. Я его включил, но матрица не передаётся. В спеке глянул, а там надо в блоки собирать юниформы. Только вот, не догнал как. Буду благодарен, если кто объяснит. И что даёт расширение GL_ARB_separate_shader_objects?

#127
21:16, 24 ноя. 2010

Алмаз
> layout(location = 5) uniform mat4 EProjView;
Это некорректно, у юниформов не может быть location, да и вообще layout применим только для uniform blocks и там другие параметры в layout. Цитирую спеку:

Layout qualifiers can be used for uniform blocks, but not for non-block uniform declarations. The layout qualifier identifiers for uniform blocks are:

  layout-qualifier-id
    shared
    packed
    std140
    row_major
    column_major

None of these have any semantic affect at all on the usage of the variables being declared; they only describe how data is laid out in memory. For example, matrix semantics are always column-based, as described in the rest of this specification, no matter what layout qualifiers are being used.

Как я и сказал ранее, применимо только для uniform blocks, но не для обычных uniform, uniform block задается следующим образом:

layout(shared) uniform LightBlock
{
  vec4 ambient;
  vec4 diffuse;
  vec4 specular;
  vec3 position;
  vec3 attenuation;
} Light;

Но использование UB довольно громоздко по количеству кода в самой программе:

#define VERT_BLOCK_LIGHT 0

typedef float float2[2];
typedef float float3[3];
typedef float float4[4];

struct PointLight
{
  float4 ambient;
  float4 diffuse;
  float4 specular;
  float3 position;
  float3 attenuation;
};

static GLuint lightBuffer           = 0;
static GLint  lightUniformIndex     = -1;
static GLint  lightUniformBlockSize = 0;

static PointLight pointLight = {{0,0,0,0}, {0,0,0,0}, {0,0,0,0}, {0,0,0}, {0.5f,0.5f,0}};

static void SetupPointLight(GLuint program, GLuint buffer, const PointLight *light)
{
  ASSERT(light);

  GLuint indices[5] = {GL_INVALID_INDEX};
  GLint  params[5]  = {0};

  // имена параметров UB
  const GLchar *names[] = {
    "Light.ambient",
    "Light.diffuse",
    "Light.specular",
    "Light.position",
    "Light.attenuation"
  };

  // получим индексы перемнных UB
  glGetUniformIndices(program, 5, names, indices);

  // получим смещения параметров UB
  glGetActiveUniformsiv(program, 5, indices, GL_UNIFORM_OFFSET, params);

  // запишем в лог-файл данные об индексах и смещениях параметров UB
  for (int i = 0; i < 5; ++i)
    LOG_DEBUG("Uniform %s [%u] GL_UNIFORM_OFFSET = %d\n", names[i], indices[i], params[i]);

  // передадим параметры источника освещения в UBO
  // это можно делать и через glMapBuffer, просто указывая смещения из params[i]
  glBindBuffer(GL_UNIFORM_BUFFER, buffer);
  glBufferSubData(GL_UNIFORM_BUFFER, params[0], sizeof(float4), light->ambient);
  glBufferSubData(GL_UNIFORM_BUFFER, params[1], sizeof(float4), light->diffuse);
  glBufferSubData(GL_UNIFORM_BUFFER, params[2], sizeof(float4), light->specular);
  glBufferSubData(GL_UNIFORM_BUFFER, params[3], sizeof(float3), light->position);
  glBufferSubData(GL_UNIFORM_BUFFER, params[4], sizeof(float3), light->attenuation);
}

// инициализаця OpenGL
bool GLWindowInit(const GLWindow *window)
{
  ASSERT(window);

  // получим индекс UB по имени "LightBlock"
  lightUniformIndex = glGetUniformBlockIndex(shaderProgram, "LightBlock");

  // получим размер UB по индексу lightUniformIndex
  glGetActiveUniformBlockiv(shaderProgram, lightUniformIndex,
    GL_UNIFORM_BLOCK_DATA_SIZE, &lightUniformBlockSize);

  LOG_DEBUG("lightUniformBlockSize = %d\n", lightUniformBlockSize);

  // создадим UBO lightBuffer
  glGenBuffers(1, &lightBuffer);
  glBindBuffer(GL_UNIFORM_BUFFER, lightBuffer);
  glBufferData(GL_UNIFORM_BUFFER, lightUniformBlockSize, 0, GL_DYNAMIC_DRAW);

  // привяжем UBO lightBuffer к слоту VERT_BLOCK_LIGHT
  glBindBufferBase(GL_UNIFORM_BUFFER, VERT_BLOCK_LIGHT, lightBuffer);

  // установим параметры источника освещения в шейдерную программу
  SetupPointLight(shaderProgram, lightBuffer, &pointLight);

  // проверим не было ли ошибок
  OPENGL_CHECK_FOR_ERRORS();
}

void GLWindowRender(const GLWindow *window)
{
  ASSERT(window);

  // привяжем слот VERT_BLOCK_LIGHT к UB в шейдерной программе shaderProgram
  glUniformBlockBinding(shaderProgram, lightUniformIndex, VERT_BLOCK_LIGHT);

  // render scene
}

Вот примерно так, как видно - довольно хлопотно. Чтобы лучше понять можно почитать Интернеты и спеки. Я как-то не решился делать урок по этой теме.

#128
21:23, 24 ноя. 2010

Алмаз
> GL_ARB_separate_shader_objects
Ну это к UB и UBO не относится никаким образом, на самом деле. Я сильно не вникал в OpenGL 4 пока, но вобщем эта штука позволяет создавать свой pipeline для обработки, который позволяет содержать несколько однотипных шейдеров в одной программе (например, несколько фрагментных шейдеров). Плюс расширение добавляет такие плюшки как glProgramUniform, функция позволяет задать юниформы для определенной программы, а не дя текущей активной, как это делает glUniform. В спеке подробней гораздо расписано, а я и ошибаться могу, т.к. не лез глубоко в OpenGL 4 еще :)

#129
22:02, 24 ноя. 2010

KpeHDeJIb
Спасибо огромное. Жаль, что всё-таки приходится хранить "lightUniformIndex".

P. S. Но всё-равно, OpenGL 3.3 мне нравится всё больше и больше. :)

#130
22:37, 24 ноя. 2010

KpeHDeJIb
> glBufferSubData(GL_UNIFORM_BUFFER, params[0], sizeof(float4), light->ambient);
> glBufferSubData(GL_UNIFORM_BUFFER, params[1], sizeof(float4), light->diffuse);
> glBufferSubData(GL_UNIFORM_BUFFER, params[2], sizeof(float4), light->specular);
> glBufferSubData(GL_UNIFORM_BUFFER, params[3], sizeof(float3), light->position);
> glBufferSubData(GL_UNIFORM_BUFFER, params[4], sizeof(float3), light->attenuation);

Можно же заменить на один вызов... Просто структуру заливать, а не по одной штуке... Только там лейаут верный выбрать...

Алмаз
> Жаль, что всё-таки приходится хранить "lightUniformIndex".

Ну а как иначе... :) С обычными юниформами ты тоже хранишь индекс...

#131
7:39, 25 ноя. 2010

Executor
> Можно же заменить на один вызов... Просто структуру заливать, а не по одной
> штуке... Только там лейаут верный выбрать...
Там если выбрать std140, у меня тоже возникали проблемы со смещениями, если внутри структуры разные данные, да и вообще то std140 :)

P.S. Проблемы не со смещениями, а с выравниванием членов структуры, так будет правильней сказать.

#132
10:42, 25 ноя. 2010

KpeHDeJIb
Не наю, я делал и никаких проблем с выравниванием не было... std140 соответствовал тому, что у меня было в Си++...
Проблемы были только при packed...

#133
19:57, 26 ноя. 2010

На будущее: неплохо было бы сглаживание прикрутить.

#134
21:21, 26 ноя. 2010

Алмаз
> На будущее: неплохо было бы сглаживание прикрутить.
Там есть пример с FSAA в бранчах - http://code.google.com/p/gl33lessons/source/browse/#svn/branches/multisample
Все никак руки не дойдут его в основной транк запихать как дефолтный способ создания окна )

Страницы: 18 9 10 1114 Следующая »
OpenGL communityФорумРазвитие сообщества

Тема в архиве.