Войти
ПрограммированиеФорумГрафика

Ковыряю этот ваш OpenGL. [вопрос в посте #55]

Страницы: 1 2 37 8 Следующая »
#0
(Правка: 19:24) 19:16, 5 авг. 2016

создал текстурку для RT, хочу в нее глубину писать

glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, width, height, 0, GL_RED, GL_UNSIGNED_BYTE, 0);
присобачил так
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, exp_texture, 0);
GLenum DrawBuffers[] = {GL_COLOR_ATTACHMENT0};
glDrawBuffers(1, DrawBuffers);

в пуксель-шойдере в нее записал:

layout(location = 0) out vec4 fragmentdepth;
void main() 
{
    const float esm_factor = 0.5;
    float color = exp(esm_factor * vPosition.z);
    fragmentdepth = vec4(vec3(color), 1);
}

и оно работает, что странно.
Но так как мне по идее и нафиг не надо этот ваш vec4(), потому что желаю юзать одноканальную  GL_RED, пробую делать так

layout(location = 0) out float fragmentdepth;
void main() 
{
    const float esm_factor = 0.5;
    float color = exp(esm_factor * vPosition.z);
    fragmentdepth = color;
}

и на выходе кукиш с маслом пустая текстура.
Зачем оно так себя ведет?


#1
19:23, 5 авг. 2016

Брось каку :)

#2
(Правка: 19:24) 19:24, 5 авг. 2016

Сначало пройди тест Люшера !
http://www.gamedev.ru/flame/forum/?id=217052

#3
19:46, 5 авг. 2016

Synthetic
> Зачем оно так себя ведет?
Блендинг?

#4
(Правка: 19:53) 19:52, 5 авг. 2016
unsigned CreateDepthTexture(unsigned width, unsigned height)
{
  unsigned depth_map;
  glGenTextures(1, &depth_map);
  glBindTexture(GL_TEXTURE_2D, depth_map);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32, width, height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0);
  glBindTexture(GL_TEXTURE_2D, 0);
  return depth_map;
}

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depth_map, 0);

#5
(Правка: 19:55) 19:53, 5 авг. 2016

MrShoor
> Блендинг?
Выключен.

Если подытожить, то мне надо в тектуру вида

glTexImage2D(GL_TEXTURE_2D, 0, GL_R32F, width, height, 0, GL_RED, GL_FLOAT, 0);
писать таким вот образом
layout(location = 0) out float fragmentdepth;
void main() 
{
    const float esm_factor = 0.5;
    float color = exp(esm_factor * vPosition.z);
    fragmentdepth = color;
}
но оно так не работает, зато работает почему-то так
layout(location = 0) out vec4 fragmentdepth;
void main() 
{
    const float esm_factor = 0.5;
    float color = exp(esm_factor * vPosition.z);
    fragmentdepth = vec4(vec3(color), 1);
}
что то нужно где-то еще включить/выключить?

#6
(Правка: 19:54) 19:54, 5 авг. 2016

programina
благодарю, но RT глубины работает ок и без пиксельного шейдера.
мне нужен именно тот изврат, что я описал:)

#7
19:56, 5 авг. 2016

Synthetic
> fragmentdepth = color;
Ты хочешь рисовать флоат?

#8
(Правка: 19:59) 19:58, 5 авг. 2016

programina
> Ты хочешь рисовать флоат?
как вариант?
а что, есть vec1() ? :)))

#9
20:00, 5 авг. 2016

Synthetic
> что то нужно где-то еще включить/выключить?
Что в логах комиляции/линковки шейдеров? Какой #version используешь?
Через CodeXL проверял на ошибки?
Можно еще попробовать glColorMask выставить.

#10
20:01, 5 авг. 2016

Справедливости ради надо сказать что vec3 и vec2 тоже не работает.
Только с vec4 всё ок.

#11
20:02, 5 авг. 2016

MrShoor
> Какой #version используешь?
#version 330

MrShoor
> Через CodeXL проверял на ошибки?
неа, дело было на маках, надеюсь придут отцы и носом ткнут без CodeXL:)

MrShoor
> Можно еще попробовать glColorMask выставить.
это как так?

#12
20:13, 5 авг. 2016

Сделай просто:

color = vec4(float,float,float,1); 

и рассматривай свою глубину.

#13
20:17, 5 авг. 2016

programina
> Сделай просто и рассматривай свою глубину.
Ну вопрос то не о том, как костыли приклеить,
а почему не работает вариант с
layout(location = 0) out float fragmentdepth;

#14
20:17, 5 авг. 2016

В цветовом буфере нет никаких флоатов, там только векторы, поэтому выводить нужно вектор, если хочешь что-то увидеть.

Страницы: 1 2 37 8 Следующая »
ПрограммированиеФорумГрафика