gpt4 book ai didi

android - Perlin 噪声着色器

转载 作者:太空狗 更新时间:2023-10-29 12:43:56 26 4
gpt4 key购买 nike

我正在尝试为我的一个应用程序创建动画背景。

基本上,我希望我的 Activity 显示 animated Perlin or Simplex noise作为背景。为了低能耗,我正在尝试使用 OpenGL 做所有事情。不幸的是,我对 OpenGL 知之甚少。

我从 Displaying Graphics with OpenGL ES 开始它奏效了。然后我尝试为 Square 替换绘图代码和顶点/fragment 着色器,但最终出现运行时异常。

我正在尝试使用以下顶点着色器:

uniform mat4 uMVPMatrix;
attribute vec4 vPosition;

void main()
{
gl_Position = uMVPMatrix * vPosition;
}

并略微更改了 Ashima Arts 中的 fragment 着色器:

float snoise(vec3 v) { 
// ..
}


uniform float time; // Used for texture animation

void main( void )
{
vec3 v_texCoord3D = gl_Position.xyz;

vec3 uvw = v_texCoord3D + 0.1*vec3(snoise(v_texCoord3D + vec3(0.0, 0.0, time)),
snoise(v_texCoord3D + vec3(43.0, 17.0, time)),
snoise(v_texCoord3D + vec3(-17.0, -43.0, time)));
// Six components of noise in a fractal sum
float n = snoise(uvw - vec3(0.0, 0.0, time));
n += 0.5 * snoise(uvw * 2.0 - vec3(0.0, 0.0, time*1.4));
n += 0.25 * snoise(uvw * 4.0 - vec3(0.0, 0.0, time*2.0));
n += 0.125 * snoise(uvw * 8.0 - vec3(0.0, 0.0, time*2.8));
n += 0.0625 * snoise(uvw * 16.0 - vec3(0.0, 0.0, time*4.0));
n += 0.03125 * snoise(uvw * 32.0 - vec3(0.0, 0.0, time*5.6));
n = n * 0.7;
// A "hot" colormap - cheesy but effective
gl_FragColor = vec4(vec3(1.0, 0.5, 0.0) + vec3(n, n, n), 1.0);
}

绘制函数:

public void draw(float[] mvpMatrix)
{
GLES20.glUseProgram(m_program);

int positionHandle = GLES20.glGetAttribLocation(m_program, "vPosition");
GLES20.glEnableVertexAttribArray(positionHandle);

int vertexStride = COORDS_PER_VERTEX * 4; // 4 bytes per vertex
GLES20.glVertexAttribPointer(positionHandle, COORDS_PER_VERTEX, GLES20.GL_FLOAT, false, vertexStride, m_vertexBuffer);

int timeHandle = GLES20.glGetUniformLocation(m_program, "time");
GLES20.glUniform1f(timeHandle, time);

int mvpMatrixHandle = GLES20.glGetUniformLocation(m_program, "uMVPMatrix");
BackgroundRenderer.checkGlError("glGetUniformLocation");

GLES20.glUniformMatrix4fv(mvpMatrixHandle, 1, false, mvpMatrix, 0);
BackgroundRenderer.checkGlError("glUniformMatrix4fv");

GLES20.glDrawElements(GLES20.GL_TRIANGLES, drawOrder.length, GLES20.GL_UNSIGNED_SHORT, m_drawListBuffer);

GLES20.glDisableVertexAttribArray(positionHandle);
}

不幸的是,我得到的只是

java.lang.RuntimeException: glGetUniformLocation: glError 1282

在这条线上提出

int mvpMatrixHandle = GLES20.glGetUniformLocation(m_program, "uMVPMatrix");

我应该如何更改我的代码?

最佳答案

这里有几个问题:

  1. 您从未检查过着色器编译日志,如果检查过,您会发现 fragment 着色器无法编译。
  2. 您只在一次调用后检查 glGetError (...),因此您认为 int mvpMatrixHandle = GLES20.glGetUniformLocation(m_program, "uMVPMatrix");是您的 GL_INVALID_OPERATION 的来源,而实际上 glUseProgram (...) 是您函数中触发它的第一行代码。

我已经更正了您的顶点和 fragment 着色器,以便它们可以编译...您不能在 fragment 着色器中使用 gl_Position,这就是为什么您的着色器无法编译而您的程序没有链接。

修改后的顶点着色器:

uniform   mat4 uMVPMatrix;
attribute vec4 vPosition;
varying vec4 vtx_pos;

void main()
{
gl_Position = uMVPMatrix * vPosition;
vtx_pos = gl_Position;
}

修改后的 fragment 着色器:

varying vec4  vtx_pos;
uniform float time; // Used for texture animation

float snoise(vec3 v) {
// ..
}

void main( void )
{
vec3 v_texCoord3D = vtx_pos.xyz;

vec3 uvw = v_texCoord3D + 0.1*vec3(snoise(v_texCoord3D + vec3(0.0, 0.0, time)),
snoise(v_texCoord3D + vec3(43.0, 17.0, time)),
snoise(v_texCoord3D + vec3(-17.0, -43.0, time)));
// Six components of noise in a fractal sum
float n = snoise(uvw - vec3(0.0, 0.0, time));
n += 0.5 * snoise(uvw * 2.0 - vec3(0.0, 0.0, time*1.4));
n += 0.25 * snoise(uvw * 4.0 - vec3(0.0, 0.0, time*2.0));
n += 0.125 * snoise(uvw * 8.0 - vec3(0.0, 0.0, time*2.8));
n += 0.0625 * snoise(uvw * 16.0 - vec3(0.0, 0.0, time*4.0));
n += 0.03125 * snoise(uvw * 32.0 - vec3(0.0, 0.0, time*5.6));
n = n * 0.7;
// A "hot" colormap - cheesy but effective
gl_FragColor = vec4(vec3(1.0, 0.5, 0.0) + vec3(n, n, n), 1.0);
}

关于android - Perlin 噪声着色器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21253621/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com