2017-03-25 4 views
-2

OpenGLを学んでいて問題があります。OpenGL:バッファオブジェクト/シェーダがスコープ外に出る

私は、すべてのメモリがOpenGLによってGPUに割り当てられていることを知っています。したがって、技術的な範囲は問題ではありませんか?しかし、私はこれを行うにしてみてください。そして、

int SetUpVertexShader(){ 
    glViewport(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); 

    //BUILD AND COMPILE SHADER 
    //VERTEX SHADER 
    GLuint vertexShader; 
    vertexShader = glCreateShader(GL_VERTEX_SHADER); 
    //snip - code to compile shader, etc etc 
    } 


}; 

int SetUpFragmentShaderandLink(){ 
    //BUILD AND COMPILE SHADER 
    //FRAGMENT SHADER 
    GLint success; 
    GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); 
    //snip - code to compile shader, etc etc 

}; 

int linkShaders(){ 
    GLuint shaderProgram = glCreateProgram(); 
    glAttachShader(shaderProgram, vertexShader); //this line has complaints saying vertexShader is an undeclared identifier 
    glAttachShader(shaderProgram, fragmentShader); // this line also has complaints saying fragmentShader is an undeclared identifier 
    //the rest of the lines all have undeclared identifier complaints 
    glLinkProgram(shaderProgram); 
    //check linking errors 
    glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success); 
    if(!success){ 
     glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog); 
     std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED" << infoLog << std::endl; 
    } 
}; 

私はリンクシェーダとプログラム機能linkShadersに得れば、私は、頂点シェーダとフラグメントシェーダがスコープ外であることを言って苦情が(具体的には、私が手を取得しますその2つは「宣言されていない識別子」であると言いました)。これらがスタック上ではなくGPU上に割り当てられている場合、なぜ彼らは範囲外になると言われていますか?私は何か間違っているのですか?

+3

ファイルはディスクに割り当てられますが、 'FILE * foo = fopen(" foo.txt "、" w ")'を宣言してスコープの外で 'foo'を使用しようとするとエラーになります。それはあなたに何かを思い出させますか? –

+0

'linkShaders'で使われている' vertexShader'と 'fragmentShader'の宣言/定義を表示してください(ヒント:あなたが表示する定義はそれぞれ' SetUpVertexShader'と 'SetUpFragmentShaderandLink'に対してローカルです)。 –

+0

@ n.m。それ以上説明できますか? – kumikan

答えて

-1

GPUメモリはヒープパターンに従っているため、スコープ外の変数はスタックパターンでのみ発生するため、問題はメモリ自体が範囲外です。

問題は、CPUメモリに格納されているこのメモリへのポインタがスタック上にあり、スコープから外れていることです。したがって、関数本体の外にGLuintポインタを宣言しなければなりません。

+0

あなたが書いたことは、事実上不正確で誤解を招くことです。役に立つよりも混乱します。上記の@n.m.のコメントを参照してください。 – datenwolf

+0

@datenwolf不正確な場所はどこにあるのか説明できますか?上記のコメントとまったく無関係なアナロジーには依存しませんが、実際には、「あなたのことを覚えていますか?」と尋ねるのではなく、さらなる研究と理解のための問題の名前と、何かの?"。だから私は本当になぜこれがdownvoteに値するのか、なぜより良い代替の答えを与えていないのか知りたいです。 Tl; dr:問題は何ですか? – xXliolauXx

+0

最初の不正確さ:メモリにスコープがありません。シンボルがあります。メモリ管理には "ヒープ**パターン**"のようなものはありません。特定のオペレーティングシステムや実行時環境では、アドレス空間に「ヒープメモリ」という概念が定義されていますが、これは厳密に定義されたものです。また、C/C++では、「ヒープ」はまったくありません。 *静的* *自動*と*動的*記憶があります。最後にOpenGLのテクスチャとバッファ名/ ID *は__not __ *ポインタですが、ハンドルです! OpenGLのテクスチャやバッファIDは、特定のメモリ位置をまったく参照しません。 – datenwolf

0

変数を使用するには範囲が必要です(これはOpenGLが関係しているかどうかに関係なく適用されます)。

glCreateShaderglCreateProgramリターンとglAttachShaderglLinkProgram使用は、OpenGLオブジェクトにハンドル(特定の目的のために一意の識別子)です。他のOpenGL呼び出し(特に最初に要求したリソースが不要になった場合には、特にクリーンアップ機能)にそれらを提供する必要があるときにアクセスできる場所に保存してください。

+0

これは、GLuintのvertexShaderのようなものがハンドルであることを意味しますか? – kumikan

+0

はい、 'vertexShader'はOpenGLによって内部的に処理されるオブジェクトへの_handle_であり、OpenGL呼び出しによって処理されます。 – Darklighter

関連する問題