android studio 渲染失败,android – OpenGL ES 3实例渲染失败,但适用于桌面

我能够在具有GLSL 330核心的桌面上使用实例渲染,但我无法在Android上运行相同的C代码(使用SDL2和NDK构建系统和Android Studio).

logcat错误如下所示:

-18 15:49:57.264 20996-21026/package I/SDL/APP: shaders/mobile/sceneShader.frag.glsl compiled successfully

10-18 15:49:57.274 20996-21026/package I/SDL/APP: Program link failed: --From Vertex Shader:

10-18 15:49:57.274 20996-21026/packageI/SDL/APP: linker error: multiple attribute attempt to bind at same location

10-18 15:49:57.274 20996-21026/packageI/SDL/APP: --From Fragment Shader:

10-18 15:49:57.274 20996-21026/package I/SDL/APP: linker error: multiple attribute attempt to bind at same location

我的桌面和移动着色器代码是相同的,除了文件顶部的#version行(分别指定es或桌面版本).

我的移动着色器代码如下所示:

#version 300 es

precision mediump float;

// attribute data

layout (location = 0) in vec3 VertexPosition;

layout (location = 1) in vec2 VertexTexCoord;

layout (location = 2) in vec3 VertexNormal;

layout (location = 3) in mat4 InstanceTransform; // used for translating the positions of instance renders

// varying data

layout (location = 0) out vec3 vPosition;

layout (location = 1) out vec2 vTexCoord0;

layout (location = 2) out vec2 vTexCoord1;

layout (location = 3) out vec3 vTexSkyboxCoord;

layout (location = 4) out vec3 vNormal;

layout (location = 5) out vec3 vClampColor;

// uniform data

layout (location = 0) uniform bool uInstanceRendering;

layout (location = 1) uniform mat4 uModelViewMatrix;

layout (location = 2) uniform mat4 uProjectionMatrix;

layout (location = 3) uniform mat3 uNormalMatrix;

layout (location = 4) uniform vec2 uTexOffset0;

layout (location = 5) uniform vec2 uTexOffset1;

void main(void)

{

vec4 mvPosition;

if (uInstanceRendering)

{

mvPosition = uModelViewMatrix * InstanceTransform * vec4(VertexPosition, 1.0);

}

else

{

mvPosition = uModelViewMatrix * vec4(VertexPosition, 1.0);

}

vTexSkyboxCoord = VertexPosition; // for skybox rendering

const float atlasRows = 6.0f;

vTexCoord0 = (VertexTexCoord / atlasRows) + uTexOffset0;

vTexCoord1 = (VertexTexCoord / atlasRows) + uTexOffset1;

vPosition = mvPosition.xyz;

vNormal = normalize(uNormalMatrix * VertexNormal);

vClampColor = clamp(VertexPosition, 0.0, 1.0);

gl_Position = uProjectionMatrix * mvPosition;

#ifdef GL_ES

gl_PointSize = 10.0f;

#endif

}

在C端和GLSL端都经常使用注释后,我将错误指向这行代码:

mvPosition = uModelViewMatrix * InstanceTransform * vec4(VertexPosition, 1.0);

如果我发表评论,程序将编译,但它将无法执行glDraw * Instaced调用而没有大量的gpu相关错误(如下所示,来自logcat).

10-18 15:58:42.504 29196-29238/package W/Adreno-GSL: <408>: ioctl fd 49 code 0xc02c093d (IOCTL_KGSL_SUBMIT_COMMANDS) failed: errno 35 Resource deadlock would occur408>

10-18 15:58:42.504 29196-29238/package W/Adreno-GSL: <323>: panel.gpuSnapshotPath is not set.not generating user snapshot323>

10-18 15:58:42.504 29196-29238/packageW/Adreno-GSL: <408>: ioctl fd 49 code 0xc02c093d (IOCTL_KGSL_SUBMIT_COMMANDS) failed: errno 35 Resource deadlock would occur408>

10-18 15:58:42.504 29196-29238/packageW/Adreno-GSL: <323>: panel.gpuSnapshotPath is not set.not generating user snapshot323>

10-18 15:58:42.504 29196-29238/packageW/Adreno-GSL: <408>: ioctl fd 49 code 0xc02c093d (IOCTL_KGSL_SUBMIT_COMMANDS) failed: errno 35 Resource deadlock would occur408>

10-18 15:58:42.504 29196-29238/packageW/Adreno-GSL: <323>: panel.gpuSnapshotPath is not set.not generating user snapshot323>

10-18 15:58:42.504 29196-29238/packageW/Adreno-GSL: <408>: ioctl fd 49 code 0xc02c093d (IOCTL_KGSL_SUBMIT_COMMANDS) failed: errno 35 Resource deadlock would occur408>

10-18 15:58:42.504 29196-29238/packageW/Adreno-GSL: <323>: panel.gpuSnapshotPath is not set.not generating user snapshot323>

10-18 15:58:42.504 29196-29238/packageW/Adreno-GSL: <408>: ioctl fd 49 code 0xc02c093d (IOCTL_KGSL_SUBMIT_COMMANDS) failed: errno 35 Resource deadlock would occur408>

10-18 15:58:42.504 29196-29238/packageW/Adreno-GSL: <323>: panel.gpuSnapshotPath is not set.not generating user snapshot323>

10-18 15:58:42.504 29196-29238/packageW/Adreno-ES20: <315>: GL_OUT_OF_MEMORY315>

我做了一个简单的例子来简单地测试实例渲染,并且使用OpenGL ES 3(也使用SDL)弹出相同的问题.

#version 300 es

precision mediump float;

// attribute data

layout (location = 0) in vec3 aVertexPosition;

layout (location = 1) in vec2 aVertexTexCoord;

layout (location = 2) in vec3 aVertexNormal;

layout (location = 3) in mat4 aInstanceTransform;

// varying data

out vec3 vPosition;

out vec2 vTexCoord;

out vec3 vNormal;

// uniform data

uniform mat4 uModelViewMatrix;

uniform mat4 uProjectionMatrix;

uniform mat3 uNormalMatrix;

void main(void)

{

vec4 mvTransform = uModelViewMatrix * aInstanceTransform * vec4(aVertexPosition, 1.0);

vTexCoord = aVertexTexCoord;

vPosition = mvTransform.xyz;

vNormal = normalize(uNormalMatrix * aVertexNormal);

gl_Position = uProjectionMatrix * mvTransform;

}

这是我设置顶点数据的地方:

glBindBuffer(GL_ARRAY_BUFFER, mVBO_InstanceData);

glBufferData(GL_ARRAY_BUFFER, instanceData.size() * sizeof(glm::mat4), instanceData.data(), GL_STATIC_DRAW);

glEnableVertexAttribArray(3);

glVertexAttribPointer(3, 4, GL_FLOAT, GL_FALSE, sizeof(glm::mat4), reinterpret_cast(0));

glVertexAttribDivisor(3, 1); // increment instance data by 1 each iteration

glEnableVertexAttribArray(4);

glVertexAttribPointer(4, 4, GL_FLOAT, GL_FALSE, sizeof(glm::mat4), reinterpret_cast(sizeof(glm::vec4)));

glVertexAttribDivisor(4, 1);

glEnableVertexAttribArray(5);

glVertexAttribPointer(5, 4, GL_FLOAT, GL_FALSE, sizeof(glm::mat4), reinterpret_cast(2 * sizeof(glm::vec4)));

glVertexAttribDivisor(5, 1);

glEnableVertexAttribArray(6);

glVertexAttribPointer(6, 4, GL_FLOAT, GL_FALSE, sizeof(glm::mat4), reinterpret_cast(3 * sizeof(glm::vec4)));

glVertexAttribDivisor(6, 1);

解决方法:

您的某些位置限定符不符合300 es着色器版本.您的顶点着色器包含以下定义:

layout (location = 0) out vec3 vPosition;

...

GLSL ES 3.00规范说:

Vertex shaders cannot have output layout qualifiers.

此限制仅在版本3.10中解除,其中相应的措辞已更改为:

Vertex and fragment shaders allow location layout qualifiers on output variable declarations.

几乎相同的事情适用于你使用的制服:

layout (location = 0) uniform bool uInstanceRendering;

...

此外,着色器版本3.00不允许制服上的布局限定符:

Layout qualifiers can be used for uniform blocks, but not for non-block uniform declarations.

同样,此选项已在3.10版中添加.

标签:c-2,android,android-ndk,opengl,opengl-es

来源: https://codeday.me/bug/20190623/1271890.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值