2

わかりました、何が問題なのかはわかっていると思いますが、これを修正する方法がわかりません。

LoadResource が複数のリソースからテキストを返しています。

(これらは、MINGW の「winres」ユーティリティによって私の EXE にコンパイルされたリソースです。) (これは OpenGL の質問ではありません。)

シェーダーのテキストを、EXE に保存されているリソースからメモリにロードしようとしています。

関連するコードは次のとおりです。

関数を呼び出す場所:

void SetupDisplay() {
    UINT vShader = LoadShaderResource (VERTEX1, GL_VERTEX_SHADER);
    UINT fShader = LoadShaderResource (FRAGMENT1, GL_FRAGMENT_SHADER);

....

シェーダーをロードするプロセスを開始している上半分.... (問題を特定しようとしてここにたくさんのものを入れました。これが見つかるまで戻ってきました:

UINT LoadShaderResource (int index, int type) {
    std::vector<std::string> Lines;
    std::string tShader = LoadTextFileResource(index);
    std::cerr << "-------BEGIN " << index << "\n";
    std::cerr <<  tShader;
    std::cerr << "-------END\n";
    std::istringstream iss(tShader);

...残りは関連性がなく、シェーダーコンパイルがクラッシュします。下部に、これが生成する理由に関する診断があります。すべてのテキストを1つの大きなグロブに戻すため、istringstreamを使用しますが、それは問題ではありません(これに続くコードが分割されています)。問題は、両方のファイルが想定されていないときに同時に含まれることです。少なくともそのうちの1つについては、それらがどのように保存されているかは私の推測ですが、これを修正する方法がわかりません.

わかりました、多分ここで何かをする必要がありますか?

std::string LoadTextFileResource(int name) {
    HMODULE handle = GetModuleHandleA(NULL);
    HRSRC rc = FindResourceA(handle, MAKEINTRESOURCE(name),  RT_RCDATA);
    HGLOBAL rcData = LoadResource(handle, rc);
    std::string result = (const char*) LockResource(rcData);
    return result;
 }

OK、C++ コードはこれですべてです。次はリソースについてです。

resource.rc

// Generated by ResEdit 1.5.11
// Copyright (C) 2006-2012
// http://www.resedit.net

#include <windows.h>
#include <commctrl.h>
#include <richedit.h>
#include "resource.h"


LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
VERTEX1        RCDATA         "..\\Data\\shader.vert"


LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
FRAGMENT1      RCDATA         "..\\Data\\shader.frag"


//
// Icon resources
//
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
IDI_ICON1          ICON           "..\\Data\\Generic.ico"

....何が続くかわかるようにアイコンのみを表示します。残りはバージョン情報などです。

私のコードをresource.rcファイルにリンクする私のresource.hファイル:

#ifndef IDC_STATIC
#define IDC_STATIC (-1)
#endif

#define IDI_ICON1                               100
#define VERTEX1                                 110
#define FRAGMENT1                               120

さて、シェーダーのテキスト。(これは OpenGL に関する質問ではないことに注意してください。)

シェーダー.フラグ

#version 330
#pragma optimize(off)
#pragma debug(on)

smooth in vec3 theColor;
out vec4 outputColor;

void main()
{
    outputColor = vec4(theColor, 1.0);
}

shader.vert

#version 330
#pragma optimize(off)
#pragma debug(on)

layout (location = 0) in vec3 inPosition;
layout (location = 1) in vec3 inColor;

smooth out vec3 theColor;

void main()
{
    gl_Position = vec4(inPosition, 1.0);
    theColor = inColor;
}

わかりました、邪魔にならないようにして、これがそれが生成するものです. (ダブルスペーシングを含みます。)

-------BEGIN 110
#version 330

#pragma optimize(off)

#pragma debug(on)



layout (location = 0) in vec3 inPosition;

layout (location = 1) in vec3 inColor;



smooth out vec3 theColor;



void main()

{

    gl_Position = vec4(inPosition, 1.0);

    theColor = inColor;

}

#version 330

#pragma optimize(off)

#pragma debug(on)



smooth in vec3 theColor;

out vec4 outputColor;



void main()

{

    outputColor = vec4(theColor, 1.0);

}

-------END
-------BEGIN 120
#version 330

#pragma optimize(off)

#pragma debug(on)



smooth in vec3 theColor;

out vec4 outputColor;



void main()

{

    outputColor = vec4(theColor, 1.0);

}

-------END

さて、お気付きのように、BEGIN 110 には両方のシェーダーが含まれていますが、BEGIN 120 には含まれていません。もちろん、110 の両方のシェーダーが問題を引き起こしています。私が理解できないのは、110 で両方のシェーダーをどこから取得しているのかということです。

ここで何かが起こっているのですが、私には理解できませんが、次に何を見ればよいのか途方に暮れています。

4

1 に答える 1

4

で、LoadTextFileResource()リソース データをstd::stringusingにコピーしstd::string::operator=(const char*)ます。この演算子は、文字列が終了していると想定していますnullnullただし、指定したポインターは、必ずしも - で終わる文字列を指しているわけではありません。これを修正するにSizeofResource()は、文字列の実際の長さを決定するために呼び出す必要があります。

std::string LoadTextFileResource(int name) {
    HMODULE handle = GetModuleHandleA(NULL);
    HRSRC rc = FindResourceA(handle, MAKEINTRESOURCE(name),  RT_RCDATA);
    HGLOBAL rcData = LoadResource(handle, rc);
    DWORD data_size = ::SizeofResource(handle, rc);

    std::string result;

    if (data_size != 0) {
        const char* data = (const char*)::LockResource(rcData);
        result.assign(data, data_size);
    }

    return result;
}
于 2012-05-13T12:22:06.110 に答える