web-dev-qa-db-ja.com

OpenGLで、シェーダープログラムによって使用されるすべてのユニフォームと属性のリストを取得する方法はありますか?

シェーダープログラムオブジェクトで使用されるすべてのユニフォームと属性のリストを取得したいと思います。 glGetAttribLocation()glGetUniformLocation()を使用して文字列を場所にマップできますが、私が本当に望んでいるのは、glslコードを解析せずに文字列のリストを作成することです。

注:OpenGL 2.0では、glGetObjectParameteriv()glGetProgramiv()に置き換えられています。そして列挙型はGL_ACTIVE_UNIFORMSGL_ACTIVE_ATTRIBUTES

43
hyperlogic

両方の例で共有される変数:

GLint i;
GLint count;

GLint size; // size of the variable
GLenum type; // type of the variable (float, vec3 or mat4, etc)

const GLsizei bufSize = 16; // maximum name length
GLchar name[bufSize]; // variable name in GLSL
GLsizei length; // name length

属性

glGetProgramiv(program, GL_ACTIVE_ATTRIBUTES, &count);
printf("Active Attributes: %d\n", count);

for (i = 0; i < count; i++)
{
    glGetActiveAttrib(program, (GLuint)i, bufSize, &length, &size, &type, name);

    printf("Attribute #%d Type: %u Name: %s\n", i, type, name);
}

ユニフォーム

glGetProgramiv(program, GL_ACTIVE_UNIFORMS, &count);
printf("Active Uniforms: %d\n", count);

for (i = 0; i < count; i++)
{
    glGetActiveUniform(program, (GLuint)i, bufSize, &length, &size, &type, name);

    printf("Uniform #%d Type: %u Name: %s\n", i, type, name);
}

OpenGLドキュメント/変数タイプ

変数タイプを表すさまざまなマクロは、ドキュメントにあります。といった GL_FLOATGL_FLOAT_VEC3GL_FLOAT_MAT4など。

68
NeARAZ

WebGLでこれを実行しようとしているこの質問を見つけた人のために、WebGLに相当するものを次に示します。

var program = gl.createProgram();
// ...attach shaders, link...

var na = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES);
console.log(na, 'attributes');
for (var i = 0; i < na; ++i) {
  var a = gl.getActiveAttrib(program, i);
  console.log(i, a.size, a.type, a.name);
}
var nu = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS);
console.log(nu, 'uniforms');
for (var i = 0; i < nu; ++i) {
  var u = gl.getActiveUniform(program, i);
  console.log(i, u.size, u.type, u.name);
}
18
Grumdrig