小编gen*_*ult的帖子

多重采样渲染缓冲区的用途是什么

如果我理解正确的话,渲染缓冲区只能用作帧缓冲区的附件,并且不能以任何方式读取或重用。如果是这样,多重采样渲染缓冲区的用例是什么?如果它们没有影响,哪些数据会写入其他 FBO 附件?或者是否可以以某种方式使用它们在主后缓冲区之外获取硬件 MSAA(WebGL2 尚不支持多重采样纹理)?

opengl-es webgl

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

如何从 Linux 编译到 Windows 的 SDL2 应用程序?

所以最近我在 Windows 10 上下载了 Linux 子系统和 Ubuntu。

我可以使用该命令将 SDL2 应用程序编译到 Linux g++,但每当我尝试使用i686-w64-mingw32-g++此命令执行此操作时,都会收到一条错误消息main.cpp:5:9: fatal error: SDL2/SDL.h: No such file or directory

我使用的命令是i686-w64-mingw32-g++ main.cpp -w -lSDL2 -o main.exe.

https://i.stack.imgur.com/TlZmQ.jpg

有人知道如何解决这个问题吗?:(

[编辑]

所以现在我尝试使用以下命令指定必要文件的目录:g++ main.cpp -I/usr/include/SDL -L/usr/lib/x86_64-linux-gnu -w -Wall -Wextra -std=c++17 -lSDL2 -o main

这有效,但是当我将它与 mingw 一起使用时,它不起作用i686-w64-mingw32-g++ main.cpp -I/usr/include/SDL -L/usr/lib/x86_64-linux-gnu -w -Wall -Wextra -std=c++17 -lSDL2 -o main

https://i.stack.imgur.com/OfCRt.jpg

c++ linux ubuntu sdl mingw

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

与 OpenGL 相比,Metal 慢得多,同时在大纹理上渲染小纹理

我正在尝试将我的项目从 OpenGL 迁移到 iOS 上的 Metal。但我似乎遇到了性能墙。任务很简单...

我有一个大纹理(超过 3000x3000 像素)。我需要在每个 touchesMoved 事件上绘制几个(几百个)小纹理(比如 124x124)。这是在启用特定混合功能的同时。它基本上就像一个画笔。然后显示大纹理。任务大致就是这样。

在 OpenGL 上它运行得非常快。我得到大约 60fps。当我将相同的代码移植到 Metal 时,我只能设法获得 15fps。

我创建了两个最低限度的示例项目来演示这个问题。这是项目(OpenGL和Metal)...

https://drive.google.com/file/d/12MPt1nMzE2UL_s4oXEUoTCXYiTz42r4b/view?usp=sharing

这大致就是我在 OpenGL 中所做的......

    - (void) renderBrush:(GLuint)brush on:(GLuint)fbo ofSize:(CGSize)size at:(CGPoint)point {
    GLfloat brushCoordinates[] = {
        0.0f, 0.0f,
        1.0f, 0.0f,
        0.0f,  1.0f,
        1.0f,  1.0f,
    };

    GLfloat imageVertices[] = {
        -1.0f, -1.0f,
        1.0f, -1.0f,
        -1.0f,  1.0f,
        1.0f,  1.0f,
    };

    int brushSize = 124;

    CGRect rect = CGRectMake(point.x - brushSize/2, point.y - brushSize/2, brushSize, brushSize);

    rect.origin.x /= size.width;
    rect.origin.y /= size.height;
    rect.size.width /= …
Run Code Online (Sandbox Code Playgroud)

performance xcode opengl-es ios metal

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

OpenGL 三角形无法在 macOS 上渲染?

当我尝试在 macOS 上使用 OpenGL 渲染三角形时,出现黑屏:

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>

static unsigned int CompileShader(unsigned int type, const std::string& source){
    unsigned int id = glCreateShader(type);
    const char* src = source.c_str();
    glShaderSource(id, 1, &src, nullptr);
    glCompileShader(id);
    
    int result;
    glGetShaderiv(id, GL_COMPILE_STATUS, &result);
    
    if(result == GL_FALSE){
        int length;
        glGetShaderiv(id, GL_INFO_LOG_LENGTH, &length);
        char* message = (char*) alloca(length*sizeof(char));
        glGetShaderInfoLog(id, length, &length, message);
        std::cout << "Failed to compile " << (type == GL_VERTEX_SHADER ? "vertex" : "fragment") << " shader" << std::endl;
        std::cout << message << …
Run Code Online (Sandbox Code Playgroud)

c++ opengl macos glfw

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

GLEW 未在 MSYS2 上定位 OpenGL 函数

我正在尝试在我的笔记本电脑上玩几个 OpenGL。作为最快的方法,我安装了 MSYS2。我安装了mingw-w64-x86_64-gccmingw-w64-x86_64-glew等等mingw-w64-x86_64-glfw3。我想我安装了所有必需的软件包。当我调用 OpenGL 例程时,我的程序就会出现分段错误。

为了制作一个最小的工作示例,我Hello, TriangleLearnOpenGL.com复制示例,以便保持较小的规模。我在这个程序中也遇到了同样的问题。

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>

void processInput(GLFWwindow *window);

// settings
const unsigned int SCR_WIDTH = 800;
const unsigned int SCR_HEIGHT = 600;

const char *vertexShaderSource = "#version 330 core\n"
    "layout (location = 0) in vec3 aPos;\n"
    "void main()\n"
    "{\n"
    "   gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n"
    "}\0";
const char *fragmentShaderSource = "#version 330 core\n"
    "out vec4 FragColor;\n"
    "void main()\n"
    "{\n"
    "   FragColor …
Run Code Online (Sandbox Code Playgroud)

c++ opengl glew glfw msys2

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

为什么我的OpenGL代码不呈现方格纹理

为什么我的屏幕只是黑色?

#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <stdio.h>
#include <stdlib.h>
//#include "include/state.h"
//#include "include/state_machine.h"
//#include "include/renderable.h"


const int WIDTH = 800;
const int HEIGHT = 600;

// called when user resizes window
void framebuffer_size_callback(GLFWwindow* window, int width, int height) {
    glViewport(0, 0, width, height);
}

// called when we receive input
void processInput(GLFWwindow *window) {
    if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
        glfwSetWindowShouldClose(window, 1);
}

GLuint get_checker_texture() {
    unsigned char texDat[64];
    for (int i = 0; i < 64; ++i)
        texDat[i] = ((i + …
Run Code Online (Sandbox Code Playgroud)

c opengl glfw

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

如何使用关键字签名在 CMake 上链接 opengl 库

我以前将 Visual Studio 与 NuGet 一起用于所有包。现在我改为 CMake。

现在我使用vcpkg来管理库。

但是,我需要 OpenGL

Cmake 链接 freeglut、glew、glm、libpng、zlib 的命令由 vcpkg 提供。但不是 OpenGL。

cmake_minimum_required(VERSION 3.0)
project(little_plane)

set(CMAKE_CXX_STANDARD 14)

add_executable(little_plane main.cpp)

# ./vcpkg install freeglut
find_package(GLUT REQUIRED)
target_link_libraries(little_plane PRIVATE GLUT::GLUT)


## ./vcpkg install glew
#find_package(GLEW REQUIRED)
#target_link_libraries(little_plane PRIVATE GLEW::GLEW)

#
# glm
find_package(glm CONFIG REQUIRED)
target_link_libraries(little_plane PRIVATE glm)

# ./vcpkg install libpng
find_package(PNG REQUIRED)
target_link_libraries(little_plane PRIVATE PNG::PNG)
##

find_package(ZLIB REQUIRED)
target_link_libraries(little_plane PRIVATE ZLIB::ZLIB)

find_package(OpenGL REQUIRED)

if (OPENGL_FOUND)
    message("opengl found")
    message("include dir: ${OPENGL_INCLUDE_DIR}")
    message("link libraries: ${OPENGL_gl_LIBRARY}") …
Run Code Online (Sandbox Code Playgroud)

c++ opengl cmake vcpkg

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

如何让各向异性过滤扩展发挥作用?

在我的(C++/OpenGL)程序中,我加载一组纹理并设置纹理参数,如下所示:

\n\n
//TEXTURES\nglGenTextures(1, &texture1);\nglBindTexture(GL_TEXTURE_2D, texture1);\n// set the texture wrapping parameters\nglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);\nglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);\n// set texture filtering parameters\nglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);\nglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);\n\nglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);\n
Run Code Online (Sandbox Code Playgroud)\n\n

我发现各向异性过滤可以帮助我增强场景的外观。因此,我使用这一行来实现它:

\n\n
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY, 16);\n
Run Code Online (Sandbox Code Playgroud)\n\n

虽然我在我的笔记本电脑(有 AMD GPU 供应商)上编译这行代码没有任何问题,但我无法在使用 Intel(R) HD Graphics 530 (Skylake GT2) 的另一台计算机上编译这段代码。\n具体来说,尝试使用 g++ 编译该代码段会输出以下错误:

\n\n
error: \xe2\x80\x98GL_TEXTURE_MAX_ANISOTROPY\xe2\x80\x99 was not declared in this scope\n glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY, 16);\n
Run Code Online (Sandbox Code Playgroud)\n\n

更具体地说,在我的 Linux 终端中运行以下命令:

\n\n
glxinfo | grep -i opengl\n
Run Code Online (Sandbox Code Playgroud)\n\n

显示有关我的 GPU 供应商和 OpenGL 支持的以下详细信息:

\n\n

在此输入图像描述

\n\n

我知道在 中启用了各向异性过滤ARB_texture_filter_anisotropic,但老实说,我不知道如何检查我的 GPU 供应商是否支持该扩展,如果支持,我如何才能使用各向异性过滤? …

c++ opengl textures glfw opengl-extensions

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

如何在 glfw 中使用 glutDisplayFunc、glutMainLoop?

我有一个使用 glut 的小程序,我现在需要使用 glfw 的原因有很多。由于我从未使用过 glfw,所以我遇到了很多问题。主要的有以下功能:glutDisplayFuncglutReshapeFuncglutIdleFuncglutMainLoop。我刚刚发现 glfw 中没有等效的功能。我应该如何修改我的程序?

我的程序是关于一个 3 维旋转的锥体

我有一个功能displaycone

void displayCone(void){

    // clear the drawing buffer.
    glClear(GL_COLOR_BUFFER_BIT);  //

    // set matrix mode
    glMatrixMode(GL_MODELVIEW);
    // clear model view matrix
    glLoadIdentity();
    // multiply view matrix to current matrix
    gluLookAt(3.0, 3.0, 3.0-4.5, 0.0, 0.0,-4.5,0,1,0);

    // ******
    glPushMatrix();


    glTranslatef(0.0, 0.0, -4.5);

    glBegin(GL_LINES);

    glColor3f (1.0, 1.0, 0.0);
    glVertex3f(0.0, 0.0, 0.0);
    glVertex3f(2.0, 0.0, 0.0);

    glColor3f (1.0, 1.0, 0.0);
    glVertex3f(0.0, 0.0, 0.0);
    glVertex3f(0.0, 2.0, …
Run Code Online (Sandbox Code Playgroud)

c++ opengl glfw opengl-compat

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

Linux 上的 C++ 插件 ABI 问题

我正在开发一个插件系统来替换共享库。

在为共享库和库中的入口点设计 API 时,我知道 ABI 问题,例如导出的类,应该仔细设计。

例如,添加、删除或重新排序导出类的私有成员变量可能会导致不同的内存布局和运行时错误(根据我的理解,这就是 Pimpl 模式可能有用的原因)。当然,在修改导出的类时,还有许多其他的陷阱需要避免。

我在这里建立了一个小例子来说明我的问题。

首先,我为插件开发人员提供以下标头:

// character.h
#ifndef CHARACTER_H
#define CHARACTER_H

#include <iostream>

class Character
{
public:
    virtual std::string name() = 0;
    virtual ~Character() = 0;
};

inline Character::~Character() {}

#endif
Run Code Online (Sandbox Code Playgroud)

然后将插件构建为共享库“ libcharacter.so”:

#include "character.h"
#include <iostream>

class Wizard : public Character
{
public:
    virtual std::string name() {
        return "wizard";
    }
};

extern "C"
{
    Wizard *createCharacter()
    {
        return new Wizard;
    }
}
Run Code Online (Sandbox Code Playgroud)

最后是使用插件的主应用程序:

#include "character.h"
#include <iostream>
#include <dlfcn.h>

int main(int argc, …
Run Code Online (Sandbox Code Playgroud)

c++ linux plugins gcc abi

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

标签 统计

c++ ×7

opengl ×6

glfw ×5

linux ×2

opengl-es ×2

abi ×1

c ×1

cmake ×1

gcc ×1

glew ×1

ios ×1

macos ×1

metal ×1

mingw ×1

msys2 ×1

opengl-compat ×1

opengl-extensions ×1

performance ×1

plugins ×1

sdl ×1

textures ×1

ubuntu ×1

vcpkg ×1

webgl ×1

xcode ×1