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);

...其余的并不重要,着色器编译崩溃,底部是由此产生的诊断结果。我使用 istringstream 是因为我将所有文本都放在一个大的 glob 中,但这不是问题,(我有遵循此拆​​分的代码。)问题是两个文件在不应该包含的同时被包含至少对于其中一个,我的猜测是它们是如何存储的,但我不知道如何解决这个问题。

好的,也许这里需要做点什么?

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;
 }

好的,这就是所有的 C++ 代码,现在是资源:

资源.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.h 文件将我的代码链接到 resource.rc 文件:

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

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

现在,着色器的文本。(请记住,这不是 OpenGL 问题。)

着色器.frag

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

smooth in vec3 theColor;
out vec4 outputColor;

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

着色器.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*)。此运算符假定您的字符串是null- 终止的。但是你给它的指针不一定指向一个 -null终止的字符串。要解决此问题,您需要调用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 回答