Glsl 顶点着色器均匀变形

Glsl 顶点着色器均匀变形,glsl,vertex-shader,Glsl,Vertex Shader,我有一个四边形,由两个三角形组成,定义如下: glm::vec3坐标[]={ glm::vec3(-1.0f,-1.0f,-0.1f), glm::vec3(1.0f,-1.0f,-0.1f), glm::vec3(1.0f,1.0f,-0.1f), glm::vec3(-1.0f,1.0f,-0.1f) }; glm::vec3法线[]={ glm::vec3(0.0f、0.0f、1.0f), glm::vec3(0.0f、0.0f、1.0f), glm::vec3(0.0f、0.0f、1.0

我有一个四边形,由两个三角形组成,定义如下:

glm::vec3坐标[]={
glm::vec3(-1.0f,-1.0f,-0.1f),
glm::vec3(1.0f,-1.0f,-0.1f),
glm::vec3(1.0f,1.0f,-0.1f),
glm::vec3(-1.0f,1.0f,-0.1f)
};
glm::vec3法线[]={
glm::vec3(0.0f、0.0f、1.0f),
glm::vec3(0.0f、0.0f、1.0f),
glm::vec3(0.0f、0.0f、1.0f),
glm::vec3(0.0f、0.0f、1.0f)
};
glm::vec2 texCoords[]={
glm::vec2(0.0f,0.0f),
glm::vec2(1.0f,0.0f),
glm::vec2(1.0f,1.0f),
glm::vec2(0.0f,1.0f)
};
无符号整数索引[]={
0, 1, 2,
2, 3, 0
};
我正试图通过黑白jpg更改四边形的“高度”,因此我编写了一个顶点着色器来实现这一点,但是转换并没有直接应用于四边形的所有点。以下是我使用的jpg: 我预计图像会突然变白,但这就是我得到的:。看起来只有左上角达到了最大高度,整个左三角形都被扭曲了

我的顶点着色器:

vec3顶点位置中的布局(位置=0); vec3顶点_法线中的布局(位置=1); vec2 vertex_texCoord中的布局(位置=2); vec4顶点颜色的布局(位置=3); out vec2 v_TexCoord; 输出vec4 v_颜色; 输出vec3 v_位置; 输出vec3 v_正常; //模型视图投影矩阵 统一mat4 u_MVP; 一致mat4u_模型矩阵; 均匀取样器2D u_纹理1_高度; void main() { v_TexCoord=顶点_TexCoord; v_颜色=顶点颜色; v_法线=mat3(u_模型矩阵)*顶点_法线; vec4 texHeight=纹理(u_Texture1_Height,v_TexCoord); vec3偏移=顶点_法线*(texHeight.r+texHeight.g+texHeight.b)*0.33; v_位置=vec3(u_模型矩阵*vec4(顶点位置+偏移,1.0f)); gl_位置=u_MVP*vec4(顶点位置+偏移,1.0f); }
凹凸贴图只是按顶点而不是按片段计算,因为您在顶点着色器中进行计算。顶点着色器仅针对每个顶点(四边形的每个角点)执行。比较和

无法为每个片段置换片段空间坐标。必须将几何体(四边形)细分为许多小四边形。由于对每个片段执行顶点着色器,因此网格中每个角点的几何体都会发生位移。这是常见的方法。参见模拟


另一种可能性是实现视差贴图,其中深度效果通过置换纹理坐标和扭曲片段着色器中的法向量来实现。请分别参阅或。

@136我建议在CPU上(或在GPU上的后期处理中)对网格进行一次细分,因为与简单的VS/FS设置相比,细分着色器速度较慢。细分着色器在顶点着色器之后执行,因此必须在细分计算着色器中计算偏移。