• 検索結果がありません。

フレームバッファをする

ドキュメント内 opengl #opengl (ページ 90-95)

いはかなりです。まず、 フレームバッファをバインドしてシーンをレンダリングします。しかし

、レンダーバッファーがえないため、にはもえません。したがって、2のは、フレームバッファを のクワッドのテクスチャとしてレンダリングすることです。そのままレンダリングしたり、をえ たりすることができます。

フルスクリーンクワッドのはのとおりです。

float vertices[] = {

// positions texture coordinates -1.0f, 1.0f, 0.0f, 1.0f,

-1.0f, -1.0f, 0.0f, 0.0f,

-1.0f, 1.0f, 0.0f, 1.0f, 1.0f, -1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f };

それらをVBOにするか、ポインタをしてレンダリングするがあります。テクスチャでフルスクリ ーンクワッドをレンダリングするためのなシェーダプログラムもになります。

シェーダ

in vec2 position;

in vec2 texCoords;

out vec2 TexCoords;

void main() {

gl_Position = vec4(position.x, position.y, 0.0, 1.0);

TexCoords = texCoords;

}

フラグメントシェーダ

in vec2 TexCoords;

out vec4 color;

uniform sampler2D screenTexture;

void main() {

color = texture(screenTexture, TexCoords);

}

GLSLのバージョンのシェーダをするがあるかもしれません。

これでのレンダリングをうことができます。のように、まずシーンをFBOにレンダリングします

。これをうには、にFBOをバインドしてクリアし、シーンをします。

glBindFramebuffer(GL_FRAMEBUFFER, FBO);

glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

// draw your scene here...

glClearでは、しているすべてのフレームバッファアタッチメントをするがありますこのでは、と

さのアタッチ。

これで、FBOをデフォルトのフレームバッファでフルスクリーンのクワッドとしてレンダリング できるようになりました。これをうには、にFBOのバインドをし、クワッドをレンダリングしま す

glBindFramebuffer(GL_FRAMEBUFFER, 0); // unbind your FBO to set the default framebuffer

glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

shader.Use(); // shader program for rendering the quad

glBindTexture(GL_TEXTURE_2D, texture); // color attachment texture glBindBuffer(GL_ARRAY_BUFFER, VBO); // VBO of the quad

// You can also use VAO or attribute pointers instead of only VBO...

glDrawArrays(GL_TRIANGLES, 0, 6);

glBindBuffer(GL_ARRAY_BUFFER, 0);

それだけですすべてをしくったは、とじシーンがされますが、フルスクリーンのクワッドにされ るはずです。ビジュアルはとじですが、フラグメントシェーダーをするだけでエフェクトをにで きます。 のでエフェクトをしてここにリンクします

オンラインでフレームバッファをむ https://riptutorial.com/ja/opengl/topic/7038/フレームバッファ

12: プログラムイントロスペクション

プログラムオブジェクトのいくつかのは、プログラムAPIをしてりすことができます。

Examples

にするは、OGLglGetProgramとパラメータGL_ACTIVE_ATTRIBUTESおよび

GL_ACTIVE_ATTRIBUTE_MAX_LENGTHしてできます。

アクティブなシェーダアトリビュートのは、OGLglGetAttribLocationによって、アトリビュート のインデックスによってすることができます。

GLuint shaderProg = ...;

std::map< std::string, GLint > attributeLocation;

GLint maxAttribLen, nAttribs;

glGetProgramiv( shaderProg, GL_ACTIVE_ATTRIBUTES, &nAttribs );

glGetProgramiv( shaderProg, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &maxAttribLen GLint written, size;

GLenum type;

std::vector< GLchar >attrName( maxAttribLen );

for( int attribInx = 0; attribInx < nAttribs; attribInx++ ) {

glGetActiveAttrib( shaderProg, attribInx, maxAttribLen, &written, &size, &type,

&attrName[0] );

attributeLocation[attrName] = glGetAttribLocation( shaderProg, attrName.data() );

}

プログラムのアクティブユニフォームにするは、OGLglGetProgramとパラメータ

GL_ACTIVE_UNIFORMSおよびGL_ACTIVE_UNIFORM_MAX_LENGTHしてできます。

アクティブなシェーダーユニフォームのは、OGLglGetActiveUniformによって、のインデックス によってできます。

GLuint shaderProg = ...;

std::map< std::string, GLint > unifomLocation;

GLint maxUniformLen, nUniforms;

glGetProgramiv( shaderProg, GL_ACTIVE_UNIFORMS, &nUniforms );

glGetProgramiv( shaderProg, GL_ACTIVE_UNIFORM_MAX_LENGTH, &maxUniformLen );

GLint written, size;

GLenum type;

std::vector< GLchar >uniformName( maxUniformLen );

for( int uniformInx = 0; uniformInx < nUniforms; uniformInx++ ) {

glGetActiveUniform( shaderProg, uniformInx, maxUniformLen, &written, &size, &type,

&uniformName[0] );

unifomLocation[uniformName] = glGetUniformLocation( shaderProg, uniformName.data() );

}

オンラインでプログラムイントロスペクションをむ https://riptutorial.com/ja/opengl/topic/10805/

プログラムイントロスペクション

13: な

Examples

ドキュメント内 opengl #opengl (ページ 90-95)

関連したドキュメント