- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试将简单的 OpenGL 绘图实现为 Framebuffer 对象,如 described here 。我的代码编译得很好,但是没有绘制几个 2D 三角形的形状,并且输出图片没有从片段着色器获取颜色。我花了很多时间,但没有找到解决方案。请帮助我。
执行期间没有异常或 OpenGL 错误。使用断点,我看到缓冲区、着色器程序、属性的所有索引都获得了适当的值。当我更改 glClearColor
时,我会得到具有指定大小和背景颜色的输出图像。我完全不知道问题出在哪里......我的代码在这里。
一般变量初始化:
GLuint framebuffer, renderbuffer;
GLuint program, uiVBO[1], uiVAO[1];
float ver[8];
_width = 512; _height = 512;
framebuffer = 0; renderbuffer = 0; program = 0;
uiVAO[0] = 0; uiVBO[0] = 0;
float pos = 1.0f; float neg = -1.0f;
ver[0] = pos; ver[1] = neg;
ver[2] = neg; ver[3] = neg;
ver[4] = pos; ver[5] = pos;
ver[6] = neg; ver[7] = pos;
创建帧和渲染缓冲区:
glGenFramebuffersEXT(1, &framebuffer);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebuffer);
glGenRenderbuffersEXT(1, &renderbuffer);
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, renderbuffer);
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGBA8, _width, _height);
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, renderbuffer);
if (glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) != GL_FRAMEBUFFER_COMPLETE_EXT) {
NSLog(@"Bad Framebuffer status!");
assert(0);
}
绘图本身:
glClearColor(0.3, 0.3, 0.3, 0);
glClear(GL_COLOR_BUFFER_BIT);
GetError();
glUseProgram(program);
GLint atr = glGetAttribLocation(program, "inPosition");
glBindVertexArray(uiVAO[0]);
glEnableVertexAttribArray(atr);
GetError();
glBindBuffer(GL_ARRAY_BUFFER, uiVBO[0]);
glBufferData(GL_ARRAY_BUFFER, 4*2*sizeof(float), ver, GL_STATIC_DRAW);
glVertexAttribPointer(atr, 2, GL_FLOAT, GL_FALSE, 0, 0);
GetError();
// I also tried GL_ELEMENT_ARRAY_BUFFER and glDrawElements
// But no result is visible anyway...
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
GetError();
glDisableVertexAttribArray(atr);
glBindVertexArray(0);
// Is it needed?
glFlush();
GetError();
// It just calls "glReadPixels"
[self saveResult];
其他东西,不是那么重要或只是明显正确:
/// Setting up OpenGL Context
CGLContextObj context = NULL;
CGLPixelFormatAttribute attributes[13] = {
kCGLPFAOpenGLProfile,
(CGLPixelFormatAttribute) kCGLOGLPVersion_GL4_Core,
kCGLPFAAccelerated,
kCGLPFAColorSize, (CGLPixelFormatAttribute)24,
kCGLPFAAlphaSize, (CGLPixelFormatAttribute)8,
kCGLPFADoubleBuffer,
kCGLPFASampleBuffers, (CGLPixelFormatAttribute)1,
kCGLPFASamples, (CGLPixelFormatAttribute)4,
(CGLPixelFormatAttribute) 0
};
CGLPixelFormatObj pix; CGLError errorCode; GLint num;
errorCode = CGLChoosePixelFormat( attributes, &pix, &num );
errorCode = CGLCreateContext(pix, NULL, &context);
CGLDestroyPixelFormat( pix );
errorCode = CGLSetCurrentContext( context );
/// Shaders creation
GLuint vertexShader = makeShader(GL_VERTEX_SHADER, loadFile(@"main", @"vsh"));
GLuint fragmentShader = makeShader(GL_FRAGMENT_SHADER, loadFile(@"main", @"fsh"));
program = glCreateProgram();
glAttachShader(program, vertexShader);
glAttachShader(program, fragmentShader);
glLinkProgram(program);
GLint status;
glGetProgramiv(program, GL_LINK_STATUS, &status);
if (0 == status) {
NSLog(@"Failed to link shader program!\n");
assert( 0 );
}
/// VAO, VBO creation
glGenVertexArrays(1, &uiVAO[0]);
glGenBuffers(1, &uiVBO[0]);
GetError();
/// Vertex shader:
#version 410
layout (location = 1) in vec2 inPosition;
void main() {
gl_Position = vec4(inPosition, 0.0, 1.0);
}
/// Fragment shader:
#version 410
out vec4 outputColor;
void main() {
outputColor = vec4(1.0, 1.0, 0.5, 1.0);
}
/// Extracts OpenGL error if it exists
#define GetError( )\
{\
for ( GLenum Error = glGetError( ); ( GL_NO_ERROR != Error ); Error = glGetError( ) )\
{\
switch ( Error )\
{\
case GL_INVALID_ENUM: printf( "\n%s\n\n", "GL_INVALID_ENUM" ); assert( 0 ); break;\
case GL_INVALID_VALUE: printf( "\n%s\n\n", "GL_INVALID_VALUE" ); assert( 0 ); break;\
case GL_INVALID_OPERATION: printf( "\n%s\n\n", "GL_INVALID_OPERATION" ); assert( 0 ); break;\
case GL_OUT_OF_MEMORY: printf( "\n%s\n\n", "GL_OUT_OF_MEMORY" ); assert( 0 ); break;\
default: break;\
}\
}\
}
/// Creates shader by string
GLuint makeShader(GLenum type, NSString *cont) {
const GLchar *source = (GLchar *)[cont cStringUsingEncoding:NSASCIIStringEncoding];
GLuint shader;
shader = glCreateShader(type);
GetError();
glShaderSource(shader, 1, &source, NULL);
GetError();
glCompileShader(shader);
GetError();
GLint logLength;
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &logLength);
GetError();
if (logLength > 0) {
GLchar *log = (GLchar *)malloc((size_t)logLength);
glGetShaderInfoLog(shader, logLength, &logLength, log);
GetError();
NSLog(@"Shader compilation failed with error:\n%s", log);
free(log);
}
GLint status;
glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
GetError();
if (0 == status) {
glDeleteShader(shader);
GetError();
NSLog(@"Shader compilation failed from code!");
assert(0);
}
return shader;
}
/// Loads file to string
NSString* loadFile(NSString *name, NSString *ext) {
NSString *absPath = [[NSBundle mainBundle] pathForResource:name ofType:ext];
return [NSString stringWithContentsOfFile:absPath encoding:NSASCIIStringEncoding error:nil];
}
最佳答案
我会检查 glViewport 是否设置正确。
关于objective-c - 苹果机,OpenGL 4 : drawing on FrameBuffer does not work,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48446093/
我正在使用 OpenGL 帧缓冲区对象 (FBO) 在 iOS 上实现模板阴影。代码有效——也就是说,从视觉上看,模板缓冲区正在完成这项工作,而且性能似乎还不错。 但是,当我通过 OpenGL ES
一个像样的图像开始于 VK_IMAGE_LAYOUT_UNDEFINED但会是 VK_IMAGE_LAYOUT_PRESENT_SRC_KHR在它们被呈现一次之后。 很多例子都做了一个过渡vkImag
我需要一种非常快速的方法来在屏幕上显示数据缓冲区。我首先尝试访问linux帧缓冲区,事实证明那是相当不错的。然后,我了解了directFB,并且喜欢它提供的额外功能(例如快速memcpy,即时调整图像
所以我正在制作一个可以使用directx10,11和opengl的引擎。 到目前为止,一切都运行良好。它可以在 opengl 和 directx 中正确渲染图像,并且两者看起来相同。 现在我添加了渲染
我使用 FBO 在我的 LevelScreen 渲染方法中渲染多 channel 模糊着色器。我想要实现的是制作一个 MenuScreen,它在背景上渲染 LevelScreen,在它上面应用另一个模
我有一个 RaspberryPi 并且想在没有 xserver 的情况下全屏显示图像 - 所以直接将它写入帧缓冲区。这里没问题。 但是设置为全屏是行不通的。 cat /sys/class/graphi
如何直接写入linux framebuffer? 最佳答案 查看 FBIOPUT_VSCREENINFO、ioctl 和 mmap (我有代码但不在这台电脑上,抱歉) 编辑:这应该让你开始 //o
android framebuffer 和 linux framebuffer 之间有什么区别吗? 问候, 玛雅克 最佳答案 Android 使用标准 Linux 帧缓冲区,如下所述:http://w
我使用一个程序来绘制一些 2D 纹理并使用它们。在这个程序中使用了 libgdx。我在使用 FrameBuffer 时遇到了一些问题。我尝试在我的 FrameBuffer 中绘制一些纹理,然后我需要保
我正在将后期处理效果集成到我的 3D 引擎中。我在使用带有 WebGL 的 FrameBuffer 对象捕获深度数据时遇到了障碍。将颜色数据捕获到 FrameBuffer 中没有问题。但是,即使为 C
我想从 Android 中的 FrameBuffer 中截取屏幕截图,我使用下面的代码,但只得到了一张模糊的图像。我包含 3 个主要步骤。首先,从 FrameBuffer 中读取数据和信息,其次,将原
我正在使用 LibGDX 框架开发一个绘画应用程序,我正在使用他们的 FrameBuffer 类将用户绘制的内容合并到实体纹理上,这就是他们所看到的绘图。这方面工作得很好,但是,用户可以绘制的区域并不
我正在学习在 Qt 中使用 OpenGL 和 QOpenGLFramebufferObject,并尝试使用以下代码绘制三角形: 在 render() 中: glUseProgram(m_program
我正在使用 opengl ES 2.0我正在使用链接到纹理的帧缓冲区来编译屏幕外渲染(一些简单的元球),然后将该纹理渲染到主后台缓冲区。 一切看起来都很棒,除了纹理出现剪裁,即。它不是完整的窗口尺寸(
我有一个直接渲染到帧缓冲区的 OpenGL 应用程序。 如果我从终端启动应用程序,有时我会看到光标在我的应用程序后面闪烁。同样,如果我从 X 中的终端仿真器内部启动它,当我四处移动鼠标时,我会瞥见鼠标
我对这些硬件的实际工作原理知之甚少,但现在我需要学习如何为 Android 设备编写 Linux 帧缓冲驱动程序。 我对 Linux 图形堆栈感到困惑。据我了解,在台式计算机上,合成窗口管理器与 DR
所以我正在尝试制作自定义按钮,为此我需要组合按钮背景的不同部分。为此,我认为使用 FrameBuffer 是可行的,但它没有给出可行的结果。因此,我尝试通过编写一个简单的测试方法来测试我的 Frame
由glGenTextures(...)、glGenFramebuffers(...)生成的id会是0吗?更具体地说,我可以使用零作为未初始化纹理的 id,还是需要使用 -1? 最佳答案 没有 glGe
我现在正在研究Ctrl+Alt+F1~F7背后的机制是什么。 我发现了一些关于framebuffer、VT和tty的信息。我知道帧缓冲区是图形卡操作的抽象,而 tty(和 pts)是程序与之交互的东西
我尝试实现一些后处理,所以我需要使用 FrameBuffer 收集整张图片,然后使用着色器对其进行后处理。我在 LibGDX( Rendering a 3D model to texture in L
我是一名优秀的程序员,十分优秀!