如果我理解正确的话,渲染缓冲区只能用作帧缓冲区的附件,并且不能以任何方式读取或重用。如果是这样,多重采样渲染缓冲区的用例是什么?如果它们没有影响,哪些数据会写入其他 FBO 附件?或者是否可以以某种方式使用它们在主后缓冲区之外获取硬件 MSAA(WebGL2 尚不支持多重采样纹理)?
所以最近我在 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
我正在尝试将我的项目从 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) 当我尝试在 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) 我正在尝试在我的笔记本电脑上玩几个 OpenGL。作为最快的方法,我安装了 MSYS2。我安装了mingw-w64-x86_64-gcc,mingw-w64-x86_64-glew等等mingw-w64-x86_64-glfw3。我想我安装了所有必需的软件包。当我调用 OpenGL 例程时,我的程序就会出现分段错误。
为了制作一个最小的工作示例,我Hello, Triangle从LearnOpenGL.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) 为什么我的屏幕只是黑色?
#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) 我以前将 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)程序中,我加载一组纹理并设置纹理参数,如下所示:
\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);\nRun Code Online (Sandbox Code Playgroud)\n\n我发现各向异性过滤可以帮助我增强场景的外观。因此,我使用这一行来实现它:
\n\nglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY, 16);\nRun Code Online (Sandbox Code Playgroud)\n\n虽然我在我的笔记本电脑(有 AMD GPU 供应商)上编译这行代码没有任何问题,但我无法在使用 Intel(R) HD Graphics 530 (Skylake GT2) 的另一台计算机上编译这段代码。\n具体来说,尝试使用 g++ 编译该代码段会输出以下错误:
\n\nerror: \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);\nRun Code Online (Sandbox Code Playgroud)\n\n更具体地说,在我的 Linux 终端中运行以下命令:
\n\nglxinfo | grep -i opengl\nRun Code Online (Sandbox Code Playgroud)\n\n显示有关我的 GPU 供应商和 OpenGL 支持的以下详细信息:
\n\n\n\n我知道在 中启用了各向异性过滤ARB_texture_filter_anisotropic,但老实说,我不知道如何检查我的 GPU 供应商是否支持该扩展,如果支持,我如何才能使用各向异性过滤? …
我有一个使用 glut 的小程序,我现在需要使用 glfw 的原因有很多。由于我从未使用过 glfw,所以我遇到了很多问题。主要的有以下功能:glutDisplayFunc,glutReshapeFunc,glutIdleFunc和glutMainLoop。我刚刚发现 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) 我正在开发一个插件系统来替换共享库。
在为共享库和库中的入口点设计 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)