c++ 着色器出现问题“着色器使用变化的---但上一个着色器未对其进行写入”

ac1kyiln  于 2022-12-01  发布在  其他
关注(0)|答案(1)|浏览(192)

有人知道为什么我总是收到这样的错误消息吗:◇着色器使用变化的_I; DATA;g_mapCoord,但是之前的着色器没有写入到它。DATA;worldPosition,但上一个着色器未写入该位置。
看看我的着色器。
顶点

  1. #version 430
  2. layout (location = 0) in vec2 position0;
  3. out DATA {
  4. vec2 v_mapCoord;
  5. vec3 worldPosition;
  6. } Out;
  7. uniform vec3 u_cameraPosition;
  8. uniform mat4 u_localMatrix;
  9. uniform mat4 u_worldMatrix;
  10. uniform float u_scaleY;
  11. uniform int u_lod;
  12. uniform vec2 u_index;
  13. uniform float u_gap;
  14. uniform vec2 u_location;
  15. uniform sampler2D s_heightmap;
  16. uniform int u_lodMorphArea[8];
  17. float morphLatitude(vec2 position)
  18. {
  19. //not important code
  20. return 0;
  21. }
  22. float morphLongitude(vec2 position)
  23. {
  24. //not important code
  25. return 0;
  26. }
  27. vec2 morph(vec2 localPosition, int morph_area){
  28. //not important code
  29. return vec2(0);
  30. }
  31. void main()
  32. {
  33. vec2 localPosition = (u_localMatrix * vec4(position0.x,0,position0.y,1)).xz;
  34. if (u_lod > 0) {
  35. localPosition += morph(localPosition, u_lodMorphArea[u_lod-1]); // Translate position by morphing vector
  36. }
  37. float height = texture(s_heightmap, localPosition).r;
  38. Out.v_mapCoord = localPosition;
  39. vec4 _worldPosition = u_worldMatrix * vec4(localPosition.x, height, localPosition.y,1);
  40. Out.worldPosition = _worldPosition.xyz;
  41. gl_Position = u_worldMatrix * vec4(localPosition.x, height, localPosition.y,1);
  42. }

片段

  1. #version 430
  2. layout (location = 0) out vec4 outputColor;
  3. in DATA {
  4. vec2 g_mapCoord;
  5. vec3 worldPosition;
  6. } In;
  7. const vec3 lightDirection = vec3(-0.2, -1.0, -0.2);
  8. const float intensity = 1.2;
  9. uniform sampler2D s_textureNormal;
  10. uniform sampler2D s_textureWater;
  11. uniform sampler2D s_textureLand;
  12. float diffuse(vec3 direction, vec3 normal, float intensity)
  13. {
  14. return max(0.01, dot(normal, -direction) * intensity);
  15. }
  16. void main()
  17. {
  18. vec3 normal = texture(s_textureNormal, In.g_mapCoord).rgb;
  19. float diff = diffuse(lightDirection, normal, intensity);
  20. outputColor = vec4(1,0,0,1);
  21. }

几何

  1. #version 430
  2. layout(triangles) in;
  3. layout(triangle_strip, max_vertices = 3) out;
  4. in vec2 te_mapCoord[];
  5. out vec2 g_mapCoord;
  6. uniform mat4 u_viewProjection;
  7. void main() {
  8. for (int i = 0; i < gl_in.length(); ++i)
  9. {
  10. vec4 position = gl_in[i].gl_Position;
  11. gl_Position = u_viewProjection * position;
  12. g_mapCoord = te_mapCoord[i];
  13. EmitVertex();
  14. }
  15. EndPrimitive();
  16. }

牵引控制系统

  1. #version 430
  2. layout(vertices = 16) out;
  3. in DATA {
  4. vec2 v_mapCoord;
  5. vec3 worldPosition;
  6. } In[];
  7. out vec2 tc_mapCoord[];
  8. const int AB = 2;
  9. const int BC = 3;
  10. const int CD = 0;
  11. const int DA = 1;
  12. uniform int u_tessellationFactor;
  13. uniform float u_tessellationSlope;
  14. uniform float u_tessellationShift;
  15. uniform vec3 u_cameraPosition;
  16. // Calculate tessellation levels
  17. float lodFactor(float dist)
  18. {
  19. float tessellationLevel = max(0.0, u_tessellationFactor/pow(dist, u_tessellationSlope) + u_tessellationShift);
  20. return tessellationLevel;
  21. }
  22. void main()
  23. {
  24. if (gl_InvocationID == 0){
  25. // Calculate mid points of the edges of the quad
  26. vec3 abMid = vec3(gl_in[0].gl_Position + gl_in[3].gl_Position)/2.0; //Bottom left, Bottom right
  27. vec3 bcMid = vec3(gl_in[3].gl_Position + gl_in[15].gl_Position)/2.0; //Bottom right Top right
  28. vec3 cdMid = vec3(gl_in[15].gl_Position + gl_in[12].gl_Position)/2.0; //Top right, Top left
  29. vec3 daMid = vec3(gl_in[12].gl_Position + gl_in[0].gl_Position)/2.0; //Top left, Bottom left
  30. // Calculate distance between camera and mid points of the edges of the quad
  31. float distanceAB = distance(abMid, u_cameraPosition);
  32. float distanceBC = distance(bcMid, u_cameraPosition);
  33. float distanceCD = distance(cdMid, u_cameraPosition);
  34. float distanceDA = distance(daMid, u_cameraPosition);
  35. // Tesselation levels used by tessellation primitive generator (define how much tessellation to apply to the patch). Value between 1 and gl_MaxTessGenLevel, depending on lodFactor.
  36. gl_TessLevelOuter[AB] = mix(1, gl_MaxTessGenLevel, lodFactor(distanceAB));
  37. gl_TessLevelOuter[BC] = mix(1, gl_MaxTessGenLevel, lodFactor(distanceBC));
  38. gl_TessLevelOuter[CD] = mix(1, gl_MaxTessGenLevel, lodFactor(distanceCD));
  39. gl_TessLevelOuter[DA] = mix(1, gl_MaxTessGenLevel, lodFactor(distanceDA));
  40. gl_TessLevelInner[0] = (gl_TessLevelOuter[BC] + gl_TessLevelOuter[DA])/4;
  41. gl_TessLevelInner[1] = (gl_TessLevelOuter[AB] + gl_TessLevelOuter[CD])/4;
  42. }
  43. tc_mapCoord[gl_InvocationID] = In[gl_InvocationID].v_mapCoord; // Just pass to the next stage
  44. gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
  45. }

TES系统

  1. #version 430
  2. layout(quads, fractional_odd_spacing, cw) in;
  3. in vec2 tc_mapCoord[];
  4. out vec2 te_mapCoord;
  5. uniform sampler2D s_heightmap;
  6. uniform float u_scaleY;
  7. void main(){
  8. float u = gl_TessCoord.x;
  9. float v = gl_TessCoord.y;
  10. // Compute new position for each tessellated vertex within the patch. gl_in with index 12, 0, 3, 15 are corners of the patch.
  11. vec4 position = ((1 - u) * (1 - v) * gl_in[12].gl_Position + u * (1 - v) * gl_in[0].gl_Position + u * v * gl_in[3].gl_Position +(1 - u) * v * gl_in[15].gl_Position);
  12. vec2 mapCoord = ((1 - u) * (1 - v) * tc_mapCoord[12] + u * (1 - v) * tc_mapCoord[0] + u * v * tc_mapCoord[3] +(1 - u) * v * tc_mapCoord[15]);
  13. float height = texture(s_heightmap, mapCoord).r;
  14. height *= u_scaleY;
  15. position.y = height;
  16. te_mapCoord = mapCoord;
  17. gl_Position = position;
  18. }

有人能帮我找到这里的错误,这就是为什么我得到的错误消息?

z9smfwbn

z9smfwbn1#

引入几何着色器时,需要从几何着色器(而不是顶点着色器)传递片段着色器的变量。
您可以看到几何体着色器是如何执行此操作的:

  1. out vec2 g_mapCoord;

与片段着色器不兼容,预期为:

  1. in DATA {
  2. vec2 g_mapCoord;
  3. vec3 worldPosition;
  4. } In;

相关问题和后续答案here

相关问题