小编shm*_*000的帖子

OpenGL混合在纹理周围创建白色边框

我正在尝试使用OpenGL(C++)将两个纹理渲染到一个矩形上.虽然我在混合他们两个时遇到了一些麻烦.

第一张图片来自.jpg文件(https://learnopengl.com/img/textures/container.jpg).此图片没有Alpha通道.

第二张图片来自.png文件(https://learnopengl.com/img/textures/awesomeface.png),并且有一个alpha通道.

问题是当我尝试混合两个图像时,它会在透明图像周围创建一个白色边框.

我已经尝试了一些不同的混合模式(在这个问题中OP的推荐:Alpha混合多个纹理留下彩色边框)但它们似乎都不起作用.

我的片段着色器看起来像这样:

#version 330 core
out vec4 FragColor;

in vec3 ourColor;
in vec2 TexCoord;

// texture samplers
uniform sampler2D texture1;
uniform sampler2D texture2;

void main()
{
    // linearly interpolate between both textures
    FragColor = mix(texture(texture1, TexCoord), texture(texture2, TexCoord), 0.5);
}
Run Code Online (Sandbox Code Playgroud)

我启用了深度测试(似乎没有任何效果),我正在使用以下代码来设置我的混合:

glEnable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
Run Code Online (Sandbox Code Playgroud)

这是我的主渲染循环:

Rendering::Pipeline pipeline = Rendering::Pipeline("src/GLSL/vertex.glsl", "src/GLSL/fragment.glsl");
pipeline.load();

//                     Position,               Color,                   Texture Coord.
//                     (X Y Z)                 (R G B)                  (S T)
float vertices [32] = …
Run Code Online (Sandbox Code Playgroud)

c++ opengl textures alpha alphablending

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

在 Windows Docker 容器上安装 MS Build Tools 失败

我正在尝试为 CI 管道设置 Windows 容器。我的项目使用 C++ 和 CMake,所以我使用的是 Microsoft Build Tools 安装程序。

注意:我不打算在我的项目中使用 .NET 框架的任何部分

不幸的是,在我的 Docker 容器中安装 MS Build Tools 失败,退出代码为 5003,并且没有错误消息。

我一直没能找到这个返回码的解释。我想知道是否有人可以告诉我我做错了什么?

我的 Dockerfile 看起来像这样:

FROM microsoft/windowsservercore:10.0.14393.1480

ADD https://aka.ms/vs/15/release/vs_buildtools.exe  C:\\tmp\\vs-build-tools.exe

RUN C:\\tmp\\vs-build-tools.exe --add Microsoft.VisualStudio.Workload.VCTools --includeRecommended --quiet --passive --norestart --wait --nocache

RUN powershell -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))"
RUN %ALLUSERSPROFILE%\chocolatey\bin\choco.exe install -y git

ENTRYPOINT C:\BuildTools\Common7\Tools\VsDevCmd.bat &&
CMD ["powershell.exe", "-NoLogo", "-ExecutionPolicy", "Bypass"]
Run Code Online (Sandbox Code Playgroud)

我正在用这个批处理脚本构建容器(用户名已被替换):

docker image rm someusername/cmake-msvc
docker build -t someusername/cmake-msvc -m 8g .
docker push …
Run Code Online (Sandbox Code Playgroud)

visual-c++ docker

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

C++在地图中使用emplace()时阻止析构函数调用

我有一个管理资源的类(网络套接字).

我编写了一个类ConnectionHandler来处理通过调用创建的网络套接字accept().

这个类在设计时考虑了RAII,当accept()调用时,返回的套接字放入a ConnectionHandler,当这超出范围时,析构函数关闭套接字.

我也ConnectionHandler通过将它们保存在地图中来跟踪我所有的打开(将套接字地址(IP:端口)映射到ConnectionHandler与该地址对应的地址).

我有一个问题,"将这些ConnectionHandler"放入地图".

我已经做到了这样一个ConnectionHandler无法复制(至少我相信我已经这样做了),但是在调用时,调用std::map::emplaceConnectionHandler析构函数(可能是为了删除在该行某处创建的临时对象)和套接字已关闭.

如您所见,这会产生问题,因为现在套接字无法在程序中进一步使用.

我有什么方法可以阻止ConnectionHandler在将它驱逐到一个被破坏者的时候被叫出来std::map

这是ConnectionHandler:头文件的代码:

class ConnectionHandler
{
    private:
        constexpr static long BUFFER_SIZE = 1 << 12;    // 4K Buffer

        SocketAddress peer;             // This is kept around to be able to produce clear exception messages when something goes wrong
        SocketFileDescriptor socket;    // using SocketFileDescriptor = int;

    public:
        ConnectionHandler() noexcept = …
Run Code Online (Sandbox Code Playgroud)

c++ sockets move raii

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

标签 统计

c++ ×2

alpha ×1

alphablending ×1

docker ×1

move ×1

opengl ×1

raii ×1

sockets ×1

textures ×1

visual-c++ ×1