小编Joa*_*cho的帖子

获得支持的GLSL版本

在使用intel显卡的笔记本电脑上进行开发时,在编译顶点着色器时,我得到了这个:

0:1(10): error: GLSL 3.30 is not supported. Supported versions are: 1.10, 1.20, 1.30, 1.00 ES, and 3.00 ES
Run Code Online (Sandbox Code Playgroud)

好吧,所以我调整着色器使用版本300 ES.同时,我想检查当前驱动程序/卡支持的GLSL版本,所以我用它:

glGetString ( GL_SHADING_LANGUAGE_VERSION )
Run Code Online (Sandbox Code Playgroud)

令我沮丧的是,只返回"1.30".

我如何获得完整列表?或者即使它不是完整列表,我如何获得标准的GL支持版本和GLES支持的版本?

opengl opengl-es opengl-es-2.0

13
推荐指数
1
解决办法
1万
查看次数

cmake 抑制外部库上的警告

我在我的项目中使用 GLAD,并使用 cmake 构建所有内容。

由于这是一个外部库而不是我的代码,我想在构建时完全抑制它的警告,因为我得到了很多这些:

warning: ISO C forbids conversion of object pointer to function pointer type [-Wpedantic]
 glad_glCullFace = ( PFNGLCULLFACEPROC ) load ( "glCullFace" );
                   ^
Run Code Online (Sandbox Code Playgroud)

我该怎么做?我可以将它包含在我的源代码中,或者使用 GLAD 的源代码做一个 add_library,不管哪种方式。

谢谢

warnings cmake suppress-warnings

9
推荐指数
1
解决办法
5915
查看次数

模板函数中的默认参数值,取决于类型

假设我有这个函数来修剪 std::string 并决定扩展它,这样它不仅会删除开头和结尾的空格,还会删除我在另一个字符串中传递的任何字符,如空格、换行符和回车。

std::string Trim ( const std::string &In_Original,
  const std::string &In_CharsToTrim = " \n\r" );
Run Code Online (Sandbox Code Playgroud)

所以基本上,它会从 In_Original 的开头和结尾删除 In_CharsToTrim 中存在的所有字符。

现在,我必须为 std::string 和 std::wstring 编写此代码。因为我觉得这很荒谬,所以我选择使用模板,它可以工作,但我无法传递默认值,因为 std::wstring 版本必须L" \n\r"作为默认值(注意那里的小 L)。

我试过这个:

template <typename Type> Type Trim ( const Type &In_String,
  const Type &In_TrimCharacters );
Run Code Online (Sandbox Code Playgroud)

随着:

template std::string Trim ( const  std::string &In_String,
  const  std::string &In_TrimCharacters = " \n\r" );
template std::wstring Trim ( const  std::wstring &In_String,
  const  std::wstring &In_TrimCharacters = L" \n\r" );
Run Code Online (Sandbox Code Playgroud)

但它没有用。它甚至不编译。

目前,我拥有的是一个单独的函数,用于在没有第二个参数的情况下调用,但这完全是错误的方法:

template <typename Type> …
Run Code Online (Sandbox Code Playgroud)

c++ templates

5
推荐指数
1
解决办法
1071
查看次数

makefile patsubst 多个表达式

我试图简化我的一些 makefile,我开始这样做:

TEMP_OBJECTS_C = $(patsubst %.c,%.c.o,$(C_SOURCES)) 
TEMP_OBJECTS_CPP = $(patsubst %.cpp,%.cpp.o,$(CPP_SOURCES)) 
Run Code Online (Sandbox Code Playgroud)

但我真正想做的只是将 .o 附加到以 .c 或 .cpp 结尾的任何内容。这仅适用于 .c,如果我想添加 cpp 文件,我必须进行完全独立的替换。我试过这个:

TEMP_OBJECTS = $(patsubst %.c,%.c.o,$(SOURCES)) $(patsubst %.cpp,%.cpp.o,$(SOURCES))
Run Code Online (Sandbox Code Playgroud)

SOURCES 是所有 cpp 和 c 文件,但随后我显然得到了重复的文件,以及其中的原始源文件名...

所以,我去了这个:

TEMP_OBJECTS = $(patsubst %.c,%.c.o,$(SOURCES))
TEMP_OBJECTS = $(patsubst %.cpp,%.cpp.o,$(TEMP_OBJECTS))
Run Code Online (Sandbox Code Playgroud)

但后来它抱怨递归。

有什么方法可以制作我需要的东西吗?谢谢

makefile

4
推荐指数
1
解决办法
4213
查看次数

sockaddr_in 和 sockaddr_in6 还在使用 sin_len 和 sin6_len 吗?

所以,基本上标题说明了一切。我一直在将我的 unix socket C 代码移植到 Windows,显然这些结构在 Windows 中没有 sin_len 或 sin6_len。

我在任何地方都使用 sockaddr_storage、sockaddr_in 和 sockaddr_in6 之间的联合,并且只是根据 ss_family 使用正确的成员。套接字库可以根据系列推断大小是有道理的,因此长度字段确实是多余的。

如果我注释掉设置长度字段的代码,一切在 OSX 和 linux 上仍然有效,但这可能只是一种错觉,所以我决定在这里问。不知何故,该变量是否已被弃用?我可以安全地停止使用它,并依靠套接字实现来使用家庭变量吗?

sockets linux windows macos

3
推荐指数
1
解决办法
3132
查看次数

延迟渲染 - Renderbuffer vs Texture

所以,我一直在读这个,我还没有得出结论.一些例子使用纹理作为渲染目标,有些人使用渲染缓冲区,有些人同时使用它们!

例如,仅使用纹理:

// Create the gbuffer textures
glGenTextures(ARRAY_SIZE_IN_ELEMENTS(m_textures), m_textures);
glGenTextures(1, &m_depthTexture);

for (unsigned int i = 0 ; i < ARRAY_SIZE_IN_ELEMENTS(m_textures) ; i++) {
    glBindTexture(GL_TEXTURE_2D, m_textures[i]);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB32F, WindowWidth, WindowHeight, 0, GL_RGB, GL_FLOAT, NULL);
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, GL_TEXTURE_2D, m_textures[i], 0);
}
Run Code Online (Sandbox Code Playgroud)

都:

glGenRenderbuffersEXT ( 1, &m_diffuseRT );
glBindRenderbufferEXT ( GL_RENDERBUFFER_EXT, m_diffuseRT );
glRenderbufferStorageEXT ( GL_RENDERBUFFER_EXT, GL_RGBA, m_width, m_height );
glFramebufferRenderbufferEXT ( GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, m_diffuseRT );
glGenTextures ( 1, &m_diffuseTexture );
glBindTexture ( GL_TEXTURE_2D, m_diffuseTexture );
glTexImage2D ( …
Run Code Online (Sandbox Code Playgroud)

opengl deferred-rendering

2
推荐指数
1
解决办法
2001
查看次数

CMakeExternalProject_add 与子文件夹上的 CMakeLists

我正在尝试使用ExternalProject_Add 命令从cmake 下载并构建DevIL,但由于某种原因,git 存储库在项目的子文件夹中包含CMakeLists.txt 文件。

我似乎无法找到一种方法使ExternalProject_add 在正确的文件夹上调用cmake。我尝试使用 prefix 和 source_dir,但仍然失败。

然后,我在网上看到一个答案,其中涉及创建一个临时的 CMakeLists.txt,它将调用正确的 cmake 路径。但由于我不知道如何提供 cmake 调用的路径,这意味着我必须将其放入下载的 git 存储库中,后来证明这很痛苦......这是我正在使用的当前命令:包括(“外部项目”)

######### Search for required third-party libraries. If not found, attempt to download and build them ########

set ( DEVIL_ROOT "${THIRD_PARTY_OUTPUT_PATH}/DevIL" )
option ( BUILD_DEVIL "Download and build DevIL" FALSE )

find_package ( Devil )
if ( NOT DEVIL_FOUND )
    message ( STATUS "DevIL not found. Forcing to build own copy...")
    set ( BUILD_DEVIL TRUE )
endif()

if ( BUILD_DEVIL )
set ( …
Run Code Online (Sandbox Code Playgroud)

git cmake external-project

1
推荐指数
1
解决办法
9125
查看次数

glReadPixels交换蓝色和红色

我正在尝试将opengl中的屏幕区域保存到位图中.我尝试过使用FreeImage和SDL_Image,它们都要求我交换红色和蓝色通道.当然,这让我怀疑glReadPixels是这里的问题......我有这个示例代码:

bool CaptureScreenRegionToFile ( uint32_t In_X, uint32_t In_Y, uint32_t In_Width, uint32_t In_Height, std::string In_Filename )
{
GLubyte* ImageData = ( GLubyte* ) malloc ( In_Width * In_Height * 3 );
glPixelStorei ( GL_PACK_ALIGNMENT, 1 );
glReadPixels ( In_X, In_Y, In_Width, In_Height, GL_RGB, GL_UNSIGNED_BYTE, ImageData );

if ( CheckError() == false )
    {
    free ( ImageData );
    return false;
    }

SDL_Surface *Surface;

// JTP TODO Known bug here. Red and blue are swapped, for some reason...
Surface = SDL_CreateRGBSurfaceFrom ( ImageData, …
Run Code Online (Sandbox Code Playgroud)

opengl sdl-image

0
推荐指数
1
解决办法
503
查看次数