着色器链接崩溃

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了着色器链接崩溃相关的知识,希望对你有一定的参考价值。

我在glLink(...)时有一个致命的信号

afficheurShader = GLES30.glCreateProgram();        
GLES30.glAttachShader(afficheurShader, afficheurVertex);  
GLES30.glAttachShader(afficheurShader, afficheurFragment)
GLES30.glLinkProgram(afficheurShader);

致命信号11(SIGSEGV),代码1 ......

afficheurShader.vert:

#version 300 es

precision highp float;
precision highp sampler2D;
precision highp int;

layout(location = 0) in uvec2 position;
layout(location = 1) in uint couleur;
uniform  sampler2D pvTex;
uniform vec2 resolution;
flat out uint vCouleur;

void main() {
    vCouleur = couleur;
    ivec2 ipos = ivec2(position);

    vec4 pos4 = texelFetch(pvTex, ipos,0);  // THIS LINE MAKE CRASH

    gl_Position = vec4(pos4.xy,0.0,1.0);
}

如果我用texelFetch注释该行,则没有崩溃:

    //vec4 pos4 = texelFetch(pvTex, ipos,0);  // THIS LINE MAKE CRASH
    vec4 pos4 = vec4(1.0,1.0,1.0,1.0);

所以我想问题是“texelFetch”......但我的语法出了什么问题?

编辑:

我使用android Studio,当我在平板电脑上运行项目时会出现问题。但是当我连接手机时做同样的事情也没问题。

编辑2:

它看到问题来自碎片!

#version 300 es
precision highp float;
flat in uint vCouleur;
uniform uint cols[256];
out vec4 outputColor;
void main() {
    int indbase = int(vCouleur*3u);
    float r = float(cols[indbase]);
    float v = float(cols[indbase+1]);
    float b = float(cols[indbase+2]);
    outputColor = vec4( r ,v,b,255.0)/255.0;
}

我在顶点中保留了未触及的texelfetch,但在片段中我评论了对数组的调用:

#version 300 es
precision highp float;
flat in uint vCouleur;
uniform uint cols[256];
out vec4 outputColor;
void main() {
    int indbase = int(vCouleur*3u);
    //float r = float(cols[indbase]);
    //float v = float(cols[indbase+1]);
    //float b = float(cols[indbase+2]);
    float r= 255.0; ///
    float v= 255.0; /// DEBUG TEMPORARY SOLUTION
    float b= 255.0; ///
    outputColor = vec4( r ,v,b,255.0)/255.0;
}

没有崩溃! (好吧,这是全白像素......)

所以,问题来自:

cols[indbase]
答案

老实说,这看起来像是一个驱动程序错误。

除非应用程序传入坏指针,否则OpenGL ES驱动程序不应该崩溃;你应该总是得到一个干净利落的错误。什么是平板电脑/ GPU有问题?

另一答案

我把所有代码都用cols从片段到顶点。

https://www.khronos.org/registry/OpenGL/specs/es/2.0/GLSL_ES_Specification_1.00.pdf

在顶点着色器中,强制支持所有形式的数组索引。在片段着色器中,仅对常量索引表达式强制支持索引。

它的工作!

以上是关于着色器链接崩溃的主要内容,如果未能解决你的问题,请参考以下文章

如果几何着色器处于活动状态,如何将信息从顶点着色器传递到片段着色器?

OpenGLES3.0创建着色器步骤

OpenGL:旧 ATI 卡上的“硬件不支持片段着色器”

为啥我的 Ray March 片段着色器反射纹理查找会减慢我的帧速率?

Shader2.0的顶点着色器和片段着色器

如何在片段着色器中将分辨率从静态更改为动态