我在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
在顶点着色器中,强制支持所有形式的数组索引。在片段着色器中,仅对常量索引表达式强制支持索引。
它的工作!