質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

2991閲覧

glUseProgram(0)の状態でレンダリングすると何が起こるのか

Tololololo

総合スコア118

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/09/02 08:02

編集2019/09/02 08:10

追記1:
もしかしてglUseProgramとglUseProgramObjectARBは全く別ものですか?


※(普段GLFWを使用しています。)

GLUTのプログラムで以下のようなコードを発見しましたが、何のためにこうしているのかがわかりません。
パッと見は単にレンダリングをしているだけのように見えますが、使用するシェーダープログラムを指定する関数が0を引数にとっています。

#####これには何か意味があるのでしょうか?

また、記載はありませんが以下のプログラムはオフスクリーンレンダリング内での処理です。そのため、描画対象は別途生成したフレームバッファオブジェクトです。

(あくまで深度値を取りたいとかならFBOはわかるのですが、何れにしてもシェーダープログラムが0を指定するので、このバッファをどうしたいのか見当もつきません。)

C++

1glUseProgramObjectARB(0); //ここ!! 2 3glEnable(GL_TEXTURE_2D); 4glColor4f(0,0,0,1); 5glPushMatrix(); 6test->render();// レンダリング時の処理(レンダリング対象のオブジェクトなどの処理準備をしている...と仮定) 7glPopMatrix();

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

glUseProgramのリファレンスには、以下のように書かれています。

If program is zero, then the current rendering state refers to an invalid program object and the results of shader execution are undefined. However, this is not an error.

…まぁ、ちょっと何言ってるかわかりませんが。

つまり、「invalid program」を指定している、言い換えれば「有効なプログラムを使っていない事」を指定している、と考えていいと思います。
特に、質問にあるプログラム例では、「glColor4f」やら「glPushMatrix」やら、固定機能レンダリングの機能を使っているので、「これ以降はプラグラマブルシェーダは使わないよ」と明示的に設定しているのでしょう。

例えば、ざっとこんなプログラムを書いてみました。

cpp

1#include <GL/glew.h> 2#include <GLFW/glfw3.h> 3#include <cstdio> 4 5int main() 6{ 7 if (!glfwInit()) { 8 std::fprintf(stderr, "%s(%d): failed to initialize GLFW.\n", __FILE__, __LINE__); 9 return 1; 10 } 11 GLFWwindow *window = glfwCreateWindow(640, 480, "Test0902a", NULL, NULL); 12 glfwMakeContextCurrent(window); 13 14 if (glewInit() != GLEW_OK) { 15 std::fprintf(stderr, "%s(%d): failed to initialize GLEW.\n", __FILE__, __LINE__); 16 return 1; 17 } 18 19 GLuint program; 20 { 21 GLuint vs = glCreateShader(GL_VERTEX_SHADER); 22 static const char *vs_source = 23 "attribute vec2 vertex;\n" 24 "void main()\n" 25 "{\n" 26 " gl_Position = vec4(vertex, 0.0f, 1.0f);\n" 27 "}\n" 28 ; 29 glShaderSource(vs, 1, &vs_source, NULL); 30 glCompileShader(vs); 31 32 GLuint fs = glCreateShader(GL_FRAGMENT_SHADER); 33 static const char *fs_source = 34 "void main()\n" 35 "{\n" 36 " gl_FragColor = vec4(0.0f, 0.0f, 0.5f, 1.0f);\n" 37 "}\n" 38 ; 39 glShaderSource(fs, 1, &fs_source, NULL); 40 glCompileShader(fs); 41 42 program = glCreateProgram(); 43 glAttachShader(program, vs); 44 glAttachShader(program, fs); 45 glLinkProgram(program); 46 47 glDeleteShader(vs); 48 glDeleteShader(fs); 49 } 50 51 while (!glfwWindowShouldClose(window)) { 52 glClearColor(0.2f, 0.2f, 0.2f, 1.0f); 53 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 54 55 glUseProgram(program); 56 GLint loc = glGetAttribLocation(program, "vertex"); 57 glEnableVertexAttribArray(loc); 58 const GLfloat vertices[] = { 59 0.0f, 0.0f, 60 -1.0f, -0.9f, 61 1.0f, -0.9f, 62 }; 63 glVertexAttribPointer(loc, 2, GL_FLOAT, GL_FALSE, 0, vertices); 64 65 glDrawArrays(GL_TRIANGLES, 0, 3); 66 67 glUseProgram(0); 68 69 glColor4f(0.0f, 0.5f, 0.0f, 1.0f); 70 glBegin(GL_TRIANGLES); 71 glVertex2f(0.0f, 0.0f); 72 glVertex2f(-1.0f, 0.9f); 73 glVertex2f(1.0f, 0.9f); 74 glEnd(); 75 76 glfwSwapBuffers(window); 77 glfwPollEvents(); 78 } 79 glfwTerminate(); 80 return 0; 81}

これを実行すると、
glUseProgram(0)有効
プログララブルシェーダを使用した箇所は緑、固定機能レンダリングを使用した箇所は青になっています。

これを、「glUseProgram(0)」の箇所をコメントアウトすると、

イメージ説明

というような感じになりました。
固定機能レンダリングの方でもシェーダプログラムが動いているように思われます。

プログラマブルシェーダを使用する可能性があるのであれば、「glUseProgram(0)」を実行して、シェーダプログラムを無効にしておいたほうがいいでしょう。


glUseProgramObjectARB」に関しては知りませんが、ググった限りでは、OpenGLにプラグラマブルシェーダが実装される前の、拡張機能として使うシェーダプログラムだと思うので、ほぼglUseProgramと同様と考えていいんじゃないでしょうか。

投稿2019/09/02 11:36

katsuko

総合スコア3471

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問