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

Рендер глубины в текстуру

Страницы: 1 2 Следующая »
#0
(Правка: 21:50) 21:44, 7 апр. 2021

Вобщим, у  меня есть код- он не работает. Не знаю где ошибка. Посмотрите свежим взглядом. Проверял работает ли screen aligned quad работает (выводил в него текстуру другую). То есть рендер в текстуру не записывается глубина. Экран просто черный.

//код инициализации
glGenFramebuffers(1, &FramebufferName);
glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName);
glGenTextures(1, &renderedTexture);
glBindTexture(GL_TEXTURE_2D, renderedTexture);

glTexImage2D( GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, 800, 600, 0, 
  GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, NULL);

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, renderedTexture, 0);  

void CVolumeFog::Draw()
{

glEnable (GL_DEPTH_TEST);
  
glAttachShader(programHandle, vertShaderDepth);
glAttachShader(programHandle, fragShaderDepth);
  
glLinkProgram(programHandle);
glUseProgram(programHandle);

glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName);

glViewport(0,0,800,600);

glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

GLuint mMVP = glGetUniformLocation(programHandle, "MVP");
if( mMVP >= 0 )
{
glUniformMatrix4fv(mMVP, 1, GL_FALSE, (const GLfloat*)&mvp);
}
  
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboIndices);

glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vboVertex);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);

//рисую в текстуру куб - то есть глубину куба
glDrawElements(GL_TRIANGLES,36,GL_UNSIGNED_INT, 0);

glDetachShader(programHandle, vertShaderDepth);
glDetachShader(programHandle, fragShaderDepth);

glBindFramebuffer(GL_FRAMEBUFFER, 0);
glViewport(0,0,800,600);

glClearColor(0.0f, 0.125f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glAttachShader(programHandle, vertShaderFog);
glAttachShader(programHandle, fragShaderFog);

glLinkProgram(programHandle);
glUseProgram(programHandle);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo_quadIndices);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vbo_quadVertex);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);

glBindTexture( GL_TEXTURE_2D, renderedTexture );

//рисуем screen aligned qued по идее с глубиной куба
glDrawElements(GL_TRIANGLES, 6 ,GL_UNSIGNED_INT, 0);

glDetachShader(programHandle, vertShaderFog);
glDetachShader(programHandle, fragShaderFog);

}

Вершинный шейдер записывает глубину

#version 430

layout (location = 0) in vec3 aPos;

layout(location = 0) out float TexDepth;

uniform mat4 MVP;
    

void main()
{

vec4 PositionT = MVP * vec4(aPos,1.0);

gl_Position = PositionT;

TexDepth=PositionT.z/55;


}

И пиксельный шейдер записывает глубину в текстуру

#version 430

out vec4 FragColor;

in float TexDepth;

void main()
{
  
    FragColor = vec4(TexDepth, TexDepth, TexDepth, 1.0f);
}

#1
21:47, 7 апр. 2021

При создании любой текстуры надо задать параметры, так как по дефолту там лажа.
https://www.khronos.org/opengl/wiki/Common_Mistakes#Creating_a_complete_texture

#2
22:09, 7 апр. 2021

Повтыкай в код glGetError, glCheckFramebufferStatus и glGetProgramInfoLog.

#3
0:12, 8 апр. 2021

Скопируй с learnopengl

#4
5:16, 8 апр. 2021

там так много потенциальных ошибок, что очень трудно сказать, из-за какой именно из них не работает.

например, здесь:
> TexDepth=PositionT.z/55;
у тебя откуда-то взялось волшебное /55, а так как результирующая глубина нормализована (0..1), ты записываешь величину (0..1/55), поэтому не исключено, что ты что-то пишешь, но оно слишком чёрное, чтобы увидеть.

opengl вообще не предназначен для отладки, отлова ошибок и вообще всего этого баловства. поэтому на нём особенно сложно может быть с новой программой преодолеть барьер со стадии "у меня вообще ничего не рисуется и я не знаю, почему" и выйти на стадию "у меня что-то неправильное рисуется, но теперь я хотя бы могу отлаживать". поэтому первую стадию отлаживаешь рендердоком, а потом уже можно добавлять отладочный код в шейдер.

#5
8:46, 8 апр. 2021

lookid
> Скопируй с learnopengl
+1000, не хочут найти рабочий пример, хочут чтобы всё расжевали

#6
8:47, 8 апр. 2021

Suslik
> opengl вообще не предназначен для отладки, отлова ошибок и вообще всего этого
> баловства

opengl вообще не предназначен для школьников, шо тупо делают копипасту

#7
(Правка: 8:55) 8:53, 8 апр. 2021

innuendo
> +1000, не хочут найти рабочий пример, хочут чтобы всё расжевали
как же ты надоел со своим советом "найди работающий пример". можно подумать, что ты чему-то научишься, если скопипастишь чужой код. я вообще наоборот никогда не пользуюсь примерами и разбираюсь с API с чистого листа, постепенно добавляя функционал, попутно разбираясь и отлаживая. потому что в будущем этот код будет всё равно будет продолжать расти, а ошибки, которые при этом будут возникать, имеет смысл учиться отлаживать с самого начала. в скопированном коде ошибок может не быть, но как только ты его будешь расширять, то они появятся, и ты понятия ну будешь иметь, где там что.

innuendo
> opengl вообще не предназначен для школьников, шо тупо делают копипасту
как раз наоборот, он только для копипаста и предназначен, потому что никаких средств валидации и отладки в нём просто нет.

#8
(Правка: 9:00) 8:58, 8 апр. 2021

Suslik
> > +1000, не хочут найти рабочий пример, хочут чтобы всё расжевали
> как же ты надоел со своим советом "найди работающий пример". можно подумать,
> что ты чему-то научишься, если скопипастишь чужой код.

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

Suslik
> потому что никаких средств валидации и отладки в нём просто нет.

прежде чем код писать нужно как минимум понимать как оно работает - отладка для нормальных людей когда ты понимаешь как должно работать, а оно не работает ... был перец, который даже на dx11 запускал renderdoc каждые 5 минут ибо не знал как оно должно работать - в лом был доки почитать

#9
(Правка: 9:04) 9:01, 8 апр. 2021

innuendo
> сам надоел - шаг первый это взять рабочий пример
отличный совет как всю жизнь проработать программистом на побегушках, которому никаких серьёзных тасков (которых нету в примерах) не дают.

> был перец, который даже на dx11 запускал renderdoc каждые 5 минут ибо не знал как оно должно работать - в лом был доки почитать
дада, тоже слышал от тебя эту песню уже десять раз. про то, что тру перцы вроде тебя страдают часами, разбираясь в тоннах ими же написанной вечноустаревшей документации, и тут приходит какой-то умник, который вместо того чтобы так же страдать, ту же проблему решает за 5 минут с рендердоком, даже не смотря в код. ясное дело, у тебя подгорит из-за этого, что ж тут удивляться.

#10
(Правка: 12:55) 9:04, 8 апр. 2021

Suslik
> отличный совет как всю жизнь проработать программистом на побегушках, которому
> никаких серьёзных тасков (которых нету в примерах) не дают.

лол, ты со мной работал хоть ? :)

это совет для школьников чтобы не создавать one more  help topic

#11
9:06, 8 апр. 2021

innuendo
> лол, ты со мной работал хоть ? :)
к счастью, нет. но буквально все, кто с тобой работали, об этом опыте отзываются негативно. ты не находишь это как бы странненьким? энивей, закончили флуд, который к теме не относится.

#12
(Правка: 9:21) 9:08, 8 апр. 2021

Suslik
> ту же проблему решает за 5 минут с рендердоком, даже не смотря в код. ясное
> дело, у тебя подгорит из-за этого, что ж тут удивляться.

не поверишь, мне нужен был renderdoc пару раз - да, когда много чужого кода и хрен знаешь где проблема

даже не смотря в код ага, самое то - зачем смотреть код, когда есть renderdoc

чувак, который даже не знает какой border может быть в семпленге теней пользует renderdoc - это как?

#13
9:09, 8 апр. 2021
Suslik
> но буквально все, кто с тобой работали, об этом опыте отзываются негативно

ох... примеры,кто со мной работал и плохо отзывался ?

#14
10:14, 8 апр. 2021

SmoothBoy
> CVolumeFog::Draw()

всё что нужно делать с шейдером тут это glUseProgram и установка юниформов

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