GL_INVALID_OPERATION在computeShader

时间:2018-03-01 16:11:05

标签: java android opengl-es

我在带有Tegra X1 GPU的Pixel C平板电脑上使用OpenGL ES 3.2和NVIDIA驱动程序361.00。我想使用计算着色器将数据写入颜色贴图,然后我将使用一些图形着色器来显示图像。

我已经将此概念用于使用桌面GL,现在我想移植到移动设备。我用Java而不是本机代码实现GL。我扩展GLSurfaceViewGLSurfaceView.Renderer,然后在OnSurfaceCreated回调期间初始化着色器程序和纹理等。

计算着色器编译得很好而没有任何错误:

#version 310 es
layout(binding = 0, rgba32f) uniform highp image2D colourMap;
layout(local_size_x = 128, local_size_y = 1, local_size_z = 1) in;

void main()
{
    imageStore(colourMap, ivec2(gl_GlobalInvocationID.xy), vec4(1.0f, 0.0f, 0.0f, 1.0f));
}

我初始化纹理

// Generate a 2D texture
GLES31.glGenTextures(1, colourMap, 0);
GLES31.glBindTexture(GLES31.GL_TEXTURE_2D, colourMap[0]);

// Set interpolation to nearest
GLES31.glTexParameteri(GLES31.GL_TEXTURE_2D, GLES31.GL_TEXTURE_MAG_FILTER, GLES31.GL_LINEAR);
GLES31.glTexParameteri(GLES31.GL_TEXTURE_2D, GLES31.GL_TEXTURE_MIN_FILTER, GLES31.GL_LINEAR);

// Create some dummy texture to begin with so we can see if it changes
float texData[] = new float[texWidth * texHeight * 4];
for (int j = 0; j < texHeight; j++)
{
    for (int i = 0; i < texWidth; i++)
    {
        // Set a few pixels in here...
    }
}
Buffer texDataBuffer = FloatBuffer.wrap(texData);
GLES31.glTexImage2D(GLES31.GL_TEXTURE_2D, 0, GLES31.GL_RGBA32F, texWidth, texHeight, 0, GLES31.GL_RGBA, GLES31.GL_FLOAT, texDataBuffer);

在此之后我在这里的着色器中设置了图像单元:编辑:我现在不这样做但只是假设在按照solidpixel创建着色器程序时会自动分配它答案。

GLES31.glUseProgram(idComputeShaderProgram);
int loc = GLES31.glGetUniformLocation(idComputeShaderProgram, "colourMap");
if (loc == -1) Log.e("Error", "Cannot locate variable");
GLES31.glUniform1i(loc, 0);

每次致GL之后,我都会使用GLES31.glGetError()检查错误 - 为清楚起见,请在此处留下。

编辑:当我发送计算时,我绑定图像纹理但首先查询单位分配:

GLES31.glUseProgram(idComputeShaderProgram);
int[] unit = new int[1];
GLES31.glGetUniformiv(idComputeShaderProgram, GLES31.glGetUniformLocation(idComputeShaderProgram, "colourMap"), unit, 0);
GLES31.glBindImageTexture(unit[0], velocityMap[0], 0, false, 0, GLES31.GL_WRITE_ONLY, GLES31.GL_RGBA32F);

这最后一行是现在出错的那一行。错误代码转换为GL_INVALID_OPERATION。着色器正确编译,程序对象有效且有效。变量的位置也是有效的。我甚至使用glGetActiveUniform()来获取变量的类型,它返回一个36941的类型,转换为GL_IMAGE_2D,我相信它是一个整数。

我仍然认为我在这里误解了一些东西,但不确定是什么。

1 个答案:

答案 0 :(得分:0)

您无法为图像指定自己的单位标识。请参阅OpenGL ES 3.2规范第7.6节。

  

如果出现以下任何一种情况,则会生成INVALID_OPERATION错误   条件发生:

     
      
  • 使用任何Uniform *命令加载图像制服。
  •   

您需要使用class Artist (models.Model): name = models.CharField(max_length=300) image=models.FileField() followers=models.IntegerField(default=0) 查询自动单位分配以获取单位名称。