#opengl #glsl #shader #vertex-shader
Вопрос:
Пытаясь создать эффект слабой глубины для каркасной модели, где расстояние от плоскости камеры изменяет цвет, я сначала попытался
gl_Position = camMatrix * vec4(aPos, 1.0);
color = vec4(0.0f,pow(2.0f, -gl_Position.z),0.0f,1.0f);
Однако это сделало бы каркас полностью черным, его края касались бы краев окна, и управление моей камерой не имело бы никакого эффекта.
Однако, если я вместо этого пересчитаю глубину при расчете цветового вектора, т. Е.
color = vec4(0.0f,pow(2.0f, -(camMatrix * vec4(aPos, 1.0)).z),0.0f,1.0f);
все работает нормально. Является ли доступ к gl_Position каким-либо образом недопустимым? Это с ядром версии 330 для GLSL
Весь файл шейдера является
#version 330 core
layout (location = 0) in vec3 aPos;
out vec4 color;
uniform mat4 camMatrix;
void main()
{
gl_Position = camMatrix * vec4(aPos, 1.0);
color = vec4(0.0f,pow(2.0f, -(camMatrix * vec4(aPos, 1.0)).z),0.0f,1.0f);
}
Комментарии:
1.
camMatrix
Содержит ли перспективная проекция? Если это так, то вам не хватает разделения перспективы, в противном случае вы вычисляете положение в пространстве обзора, а не проецируемое положение. В обоих случаях расчет не совпадаетgl_Position.z
.2. Фактическая математика сейчас не имеет для меня большого значения, просто она
camMatrix * vec4(aPos, 1.0).z
работает, аgl_position.z
не работает, несмотря на то, что, насколько я могу судить, они одинаковы3. Я понимаю это, но эти две вещи не одно и то же. z после проекции и разделения перспективы нормализуется, в то время как до проекции оно находится в единицах OpenGL.
4. @Запятая, если
camMatrix
это матрица перспективной проекции, вы ошибаетесь.5. Я должен согласиться с @Запятыми здесь. Другие комментарии до сих пор не соответствуют сути вопроса (хотя они обоснованно указывают на сомнительное использование пространства z для этого вычисления), но оба варианта, показанные в вопросе, должны дать один и тот же результат (независимо от того, насколько полезен этот результат на практике).