gpt4 book ai didi

c++ - 使用 Win32 读取文件时 glShaderSource 访问冲突

转载 作者:行者123 更新时间:2023-11-28 01:14:51 25 4
gpt4 key购买 nike

因此,我正在尝试仅使用 Win32 API 和 OpenGL 来设置基本的 OpenGL 场景,但是我在加载着色器和 glShaderSource 函数方面遇到了很大的问题。我正在这样阅读我的文件:

//HEADER

class FileReader
{
public:
FileReader(const LPCSTR FileName);

const void* GetFileData();

~FileReader();
private:

HANDLE FileHandle;

void* FileDataMemory;
};

//ACTUAL CODE

FileReader::FileReader(const LPCSTR FileName)
{
FileHandle = CreateFileA(FileName, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (FileHandle == INVALID_HANDLE_VALUE)
{
OutputDebugStringA("Failed to open file ");
OutputDebugStringA(FileName);
OutputDebugStringA(" for reading, application could not be loaded\n");
ExitProcess(-2);
}

unsigned int FileSize = GetFileSize(FileHandle, 0);
DWORD BytesRead;
FileDataMemory = VirtualAlloc(0, FileSize, MEM_COMMIT, PAGE_READWRITE);
ReadFile(FileHandle, FileDataMemory, FileSize, &BytesRead, 0);
if (BytesRead < FileSize)
{
OutputDebugStringA("File was not read completely\n");
}
}

const void* FileReader::GetFileData()
{
return FileDataMemory;
}

FileReader::~FileReader()
{
CloseHandle(FileHandle);
}

然后我使用此类从磁盘加载顶点着色器,如下所示:

    VertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(VertexShader, 1, static_cast<const GLchar* const*>(VertexShaderFile->GetFileData()), 0);

但我的应用程序在 glShaderSource 上为我提供了读取地址 0xFFFFFFFF 的访问冲突。我很困惑,因为当我尝试在 Debug模式下查看这 block 内存时,它看起来很正常,而且里面有正确的数据,所以我不知道该怎么做。

最佳答案

从文件中读取的着色器源代码字符串不是以0结尾的。
预留FileSize+1字节的内存,并确保缓冲区的最后一个字节为0。例如:

FileDataMemory = VirtualAlloc(0, FileSize+1, MEM_COMMIT, PAGE_READWRITE);
ZeroMemory(FileDataMemory, FileSize+1);
ReadFile(FileHandle, FileDataMemory, FileSize, &BytesRead, 0);

此外,glShaderSource 的第三个参数是一个字符串数组(const GLchar **):

const GLchar *source = static_cast<const GLchar*>(VertexShaderFile->GetFileData());
glShaderSource(VertexShader, 1, &source, 0);

您在代码中实际做的是转换 VertexShaderFile->GetFileData()。你需要做的是转换 &VertexShaderFile->GetFileData()


此外,我建议使用STL来读取着色器源文件。例如:

std::ifstream sourceFile(FileName, std::fstream::in); 
std::string sourceCode = std::string(
std::istreambuf_iterator<char>(sourceFile),
std::istreambuf_iterator<char>());

关于c++ - 使用 Win32 读取文件时 glShaderSource 访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59022051/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com