【问题标题】:Uniform Variables Display a black screen using jogl统一变量使用 jogl 显示黑屏
【发布时间】:2016-12-07 13:55:07
【问题描述】:

我一直在使用 jogl 拼凑一个基本的游戏引擎,并且在我的着色器代码中访问和/或更新统一变量时遇到了很大的困难。

这是我分配矩阵和相关缓冲区的方式:

protected float[] test_matrix = {
    1.0f, 0.0f, 0.0f, 1.0f,
    0.0f, 1.0f, 0.0f, 1.0f,
    0.0f, 0.0f, 1.0f, 1.0f,
    0.0f, 0.0f, 0.0f, 1.0f
};
protected int matrix_size = test_matrix.length;

FloatBuffer matrix_buffer = Buffers.newDirectFloatBuffer(test_matrix, 0, matrix_size);

这里是有问题的代码:

shaderProgram = gl.glCreateProgram();
gl.glAttachShader(shaderProgram, vertShader);
gl.glAttachShader(shaderProgram, fragShader);

pmvmatrix = new PMVMatrix();
transmatrix_location = gl.glGetUniformLocation(shaderProgram, "transformationMatrix");
gl.glUniformMatrix4fv(transmatrix_location, 400, false, matrix_buffer);

pmvmatrix.glMatrixMode(GLMatrixFunc.GL_MODELVIEW);
pmvmatrix.glLoadIdentity();

gl.glBindAttribLocation(shaderProgram, 0, "position");
gl.glBindAttribLocation(shaderProgram, 1, "color");

gl.glLinkProgram(shaderProgram);

这是我的顶点着色器:

#version 400 core

in vec3 position;

out vec3 color;

uniform mat4 transformationMatrix;

void main(void){
    gl_Position = transformationMatrix * vec4(position,1.0);
    color = vec3(position.x+0.5,1.0,position.y+0.5);
}

着色器编译成功,如果我删除顶点着色器中的“transformationMatrix *”,对象将正确渲染。

我的矩阵是作为 1X16 矩阵而不是 4X4 矩阵传递的吗?我是否正确使用了 glUniformMatrix4fv 函数?

【问题讨论】:

  • transmatrix_location 是否小于零?

标签: opengl glsl jogl


【解决方案1】:
transmatrix_location = gl.glGetUniformLocation(shaderProgram, "transformationMatrix");
...
gl.glLinkProgram(shaderProgram);

走错路了。 Link, then Get:

...分配给统一变量的实际位置未知 直到程序对象链接成功。链接后有 发生时,可以使用命令glGetUniformLocation 获取 统一变量的位置。 ...

【讨论】:

  • 切换了那些,仍然得到一个空白屏幕。我的 transmatrix_location 变量返回“0”。那应该是一个非零数字吗?
  • @PeterHope:不,零是完全有效的。
  • 嗯,现在我正在调用 glLinkProgram、glGetUniformLocation、glUniformMatrix4fv,然后设置矩阵模式和加载标识。对吗?
  • @Peter.Hope:不,这也不正确。您必须激活 GLSL 程序(通过调用 glUseProgram (...) 才能有意义地调用 glUniformMatrix4fv (...)。着色器 API 的其他部分允许您通过名称传递程序,但这不是其中之一......它使用任何程序当前处于活动状态(根据您的代码判断为 0)。
  • 对于奖励积分,有一部分着色器 API 可以让您传递制服的程序名称。如果您的实现支持它(GL 4.1 中的核心),您会发现glProgramUniform* (...) 允许您在不更改绑定程序对象的情况下指定统一数据。
猜你喜欢
  • 1970-01-01
  • 2011-01-11
  • 2012-01-15
  • 2020-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多