我的OpenGL学习进阶之旅解决着色器语法错误:The shader uses varying u_Color, but previous shader does not write to it

Posted 字节卷动

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我的OpenGL学习进阶之旅解决着色器语法错误:The shader uses varying u_Color, but previous shader does not write to it相关的知识,希望对你有一定的参考价值。

一、错误描述

在加载完顶点着色器和片段着色器,然后link生成program的时候,出现了错误,如下所示:

2021-12-31 09:34:01.072 15937-16006/com.oyp.openglesdemo E/NDK_JNI_LOG_TAG: [GLUtils.cpp][createProgram][181]: GLUtils::createProgram error linking program:
    The  shader uses varying u_Color, but previous shader does not write to it.
    Out of resource error.

二、分析错误

这个错误一看就是片段着色器的变量 u_Color 有问题。

片段着色器这个 u_Color变量需要 顶点着色器输出过来

片段着色器代码如下:

  • fragment/fragment_shader_air_hockey.glsl
#version 300 es

precision mediump float;

in vec4 u_Color;

out vec4 fragColor;

void main()

    fragColor = u_Color;

顶点着色器代码如下:

  • vertex/vertex_shader_air_hockey.glsl
#version 300 es

layout(location = 0) in vec4 a_Position;
layout(location = 1) in vec4 a_Color;

out vec4 v_Color;

void main()

    v_Color = a_Color;
    gl_Position = a_Position;
    gl_PointSize = 10.0;


所以原因就是

  1. 顶点着色器输出out的变量名为v_Color
  2. 片段着色器输入in的变量名为u_Color

所以对不上,从而导致Link Program 出错!

三、解决问题

将顶点着色器输出的变量名和片段着色器输入的变量名统一,保持一致即可。

修改之后片段着色器代码如下:

  • fragment/fragment_shader_air_hockey.glsl
#version 300 es

precision mediump float;

in vec4 v_Color;

out vec4 fragColor;

void main()

    fragColor = v_Color;

改完重新编译,正常运行

以上是关于我的OpenGL学习进阶之旅解决着色器语法错误:The shader uses varying u_Color, but previous shader does not write to it的主要内容,如果未能解决你的问题,请参考以下文章

我的OpenGL学习进阶之旅解决着色器语法错误:The shader uses varying u_Color, but previous shader does not write to it

我的OpenGL学习进阶之旅解决着色器语法错误:The shader uses varying u_Color, but previous shader does not write to it

我的OpenGL学习进阶之旅解决着色器语法错误:The shader uses varying u_Color, but previous shader does not write to it

我的OpenGL学习进阶之旅着色器GLSL运行时报错 GLSL compile error: Premature end of line

我的OpenGL学习进阶之旅着色器GLSL运行时报错 GLSL compile error: Premature end of line

我的OpenGL学习进阶之旅解决着色器编译错误:#version directive must occur on the first line of the shader