如何在LWJGL中向Shader传递一个float数组?

问题描述 投票:2回答:1

我一直在按照LWJGL网站上的教程(http:/wiki.lwjgl.orgwikiGLSL_Tutorial:_Communicating_with_Shaders.html。我试着复制粘贴 "arrayOfInts "的例子来尝试隔离问题,把所有的东西都改成了ints,但我还是只能得到零的shader端。根据文档( https:/javadoc.lwjgl.orgorglwjglopenglGL20.html#glUniform1iv(int,int%5B%5D) ),函数 glUniform1iv 存在,并能满足我的需求,但当我尝试时,Eclipse告诉我它不存在于GL20类中,无论是在使用一个 int[]IntBuffer,同样是 glUniform1fv. 统一变量的位置为0,因此它的加载是正确的。生成的java数组中存储的值是正确的。

顶点着色器。

#version 400 core

in vec3 position;
out vec2 uvPosition;

void main(void){
    gl_Position = vec4(position, 1.0);
    uvPosition = (position.xy+vec2(1.0, 1.0))/2;
}

片段着色器

#version 400 core

in vec2 uvPosition;
out vec4 outColor;

uniform int random[50];

int randomIterator = 0;

float randf(){
    return random[randomIterator++];
}

void main(void){
    outColor = vec4(random[0]/10, 1.0, 1.0, 1.0);
}

我加载统一的Java代码。

    final int RAND_AMOUNT = 50;
    IntBuffer buffer = BufferUtils.createIntBuffer(RAND_AMOUNT);
    int[] array = new int[RAND_AMOUNT];
    for(int i = 0; i < RAND_AMOUNT; i++) {
        buffer.put((int)(Math.random()*9.999f));
        array[i] = (int)(Math.random()*9.999f);
    }
    buffer.rewind();
    System.out.println(buffer.get(0));
    GL20.glUniform1(glGetUniformLocation(programID, "random"), buffer); //In this line, using GL20.glUniform1iv tells me it doesn't exist. Same with

没有任何错误,显示为青色,意味着红色组件为0. 任何帮助制作随机ints或直接发送随机float的方法都会有帮助. 欢迎提出任何问题。

java opengl-es glsl lwjgl
1个回答
1
投票

glUniform* 在当前安装程序的默认统一块中设置一个统一值。因此,该程序必须通过 glUseProgram 之前。

int random_loc = GL20.glGetUniformLocation(programID, "random")

GL20.glUseProgram(programID);
GL20.glUniform1(random_loc, buffer);
© www.soinside.com 2019 - 2024. All rights reserved.