Шейдер вершин GLSL прерывается при попытке доступа к gl_Position

#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 для этого вычисления), но оба варианта, показанные в вопросе, должны дать один и тот же результат (независимо от того, насколько полезен этот результат на практике).