好的,我想我知道出了什么问题,但我不知道如何解决这个问题。
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 中获取两个着色器的位置?
这里发生了一些我不明白的事情,但我不知道接下来要看什么。