いはかなりです。まず、 フレームバッファをバインドしてシーンをレンダリングします。しかし
、レンダーバッファーがえないため、にはもえません。したがって、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/
プログラムイントロスペクション