LoginSignup
8
4

More than 3 years have passed since last update.

openFrameworksでshaderにUniformArrayで渡す方法

Last updated at Posted at 2018-03-03

arrayで渡す時にやり方がよくわからなかったのでメモ

コード

int/floatの場合

  • 1個目の要素のポインタを渡す。
main.cpp
ofShader shader;

vector <float> nums;

for (int i = 0; i < 10; i++) {
    nums.push_back(ofRandom(1));
}

// 第二引数にmatの1個目,第三引数にcountを渡す
shader.setUniform1fv("nums", &nums[0], nums.size());
fragment.glsl
#version 150

uniform float nums[10];

vecの場合

  • 1個目のvecのx要素のポインタを渡す。
main.cpp
ofShader shader;

vector <glm::vec4> vectors;

glm::vec4 vec1;
glm::vec4 vec2;
glm::vec4 vec3;

matrices.push_back(vec1);
matrices.push_back(vec2);
matrices.push_back(vec3);

// 第二引数にmatの1個目,第三引数にcountを渡す
shader.setUniform4fv("vectors", &vectors[0].x, matrices.size());
fragment.glsl
#version 150

uniform vec4 vectors[3];

matの場合

  • 1個目のmatを直接渡す。
main.cpp
ofShader shader;

vector <glm::mat4> matrices;

glm::mat4 mat1;
glm::mat4 mat2;
glm::mat4 mat3;

matrices.push_back(mat1);
matrices.push_back(mat2);
matrices.push_back(mat3);

// 第二引数にmatの1個目,第三引数にcountを渡す
shader.setUniformMatrix4f("matrices", matrices[0], matrices.size());
fragment.glsl
#version 150

uniform mat4 matrices[3];

まとめ

  • matの時だけmatそのものを渡す
  • それ以外は1個目の要素のポインタを渡す

 おまけ

openglの場合

main.cpp
ofShader shader;

vector <glm::mat4> matrices;

glm::mat4 mat1;
glm::mat4 mat2;
glm::mat4 mat3;

matrices.push_back(mat1);
matrices.push_back(mat2);
matrices.push_back(mat3);

// 第二引数にcountの1個目,第四引数に1個目のmatの[0][0](要するにGLfloatの配列の1個目)のポインタを渡す
glUniformMatrix3fv(shader.getUniformLocation("matrices"), matrices.size(), GL_FALSE, glm::value_ptr(matrices[0]));

// glm::value_ptr(matrices[0])はglm::value_ptr(matrices[0][0][0])やglm::value_ptr(matrices[0][0].x)と同義

以上です。間違ってたらコメントお願いします🙇

8
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
4