GLSLのin / outキーワード


46

GLSLでin/ outキーワードを使用する方法を本当に理解しておらず、グーグルは特徴的に役に立たない。

彼らは正確に何をしますか?たとえば、頂点ごとに可変変数セットをフラグメントシェーダーに渡したい場合、どのように使用しますか?

文字通り、私が見つけたすべてのチュートリアルではvarying/ attributeキーワードを使用していますが、これは役に立ちません。

回答:


65

ストレージ修飾子inout実際に含まれているとが取って代わるの目的持っているvaryingとしますattribute。彼らは、変数がそれぞれどのような定義入れて外にシェーダのプット。参照してくださいGLSL 4.2リファレンスカード 7ページ:

  • in:前のステージからシェーダーへのリンケージ
  • out:シェーダーから次のステージへのリンケージ
  • attributein頂点シェーダーと同じ
  • varyingout頂点シェーダーと同じin、フラグメントシェーダーと同じ(注:上記の参照カードでは、これらは誤って反転されています。)

補足として、後者の2つは非推奨です。4.2コアプロファイルには存在せず、互換性プロファイルにのみ存在します。


彼らは正確に何をしますか?

使用方法については、Antroから最新のOpenGLへの頂点シェーダーを使用してください。第2.2章:シェーダー

#version 110

attribute vec2 position;    
varying vec2 texcoord;

void main()
{
    gl_Position = vec4(position, 0.0, 1.0);
    texcoord = position * vec2(0.5) + vec2(0.5);
}

4.2コアでは次のように書き換える必要があります。

#version 420

in vec2 position;    
out vec2 texcoord;

void main()
{
    gl_Position = vec4(position, 0.0, 1.0);
    texcoord = position * vec2(0.5) + vec2(0.5);
}

役に立たないチュートリアル

「古い」チュートリアルコードを見つける主な理由は、誰もがGLSL 3.3+互換のハードウェアにアクセスできるわけではないからだと思います。とにかく、良い最新のチュートリアルのために、ニコル・ボーラスの「 Learning Modern 3D Graphics Programming 」の方向に喜んであなたを向けます。


2
@NicolBolasハ!私はすでにそれで怪しい何かがあると思った。それはその参照カードのエラーです。ありがとう!:
エリック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.