- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想使用 FBO 进行离屏渲染(在没有任何 WS 的控制台环境中)。
我知道有必要为任何操作创建一个 OpenGL 上下文,并且至少有一个虚拟窗口,因此我做了以下初始化:
// Step 1 - Get the default display.
eglDisplay = eglGetDisplay((EGLNativeDisplayType)0);
// Step 2 - Initialize EGL.
EGLint iMajorVersion, iMinorVersion;
if (!eglInitialize(eglDisplay, &iMajorVersion, &iMinorVersion))
{
printf("Error: eglInitialize() failed.\n");
goto cleanup;
}
// Step 3 - Make OpenGL ES the current API.
eglBindAPI(EGL_OPENGL_ES_API);
if (!TestEGLError("eglBindAPI"))
{
goto cleanup;
}
// Step 4 - Specify the required configuration attributes.
EGLint pi32ConfigAttribs[5];
pi32ConfigAttribs[0] = EGL_SURFACE_TYPE;
pi32ConfigAttribs[1] = EGL_WINDOW_BIT;
pi32ConfigAttribs[2] = EGL_RENDERABLE_TYPE;
pi32ConfigAttribs[3] = EGL_OPENGL_ES2_BIT;
pi32ConfigAttribs[4] = EGL_NONE;
// Step 5 - Find a config that matches all requirements.
int iConfigs;
if (!eglChooseConfig(eglDisplay, pi32ConfigAttribs, &eglConfig, 1, &iConfigs) || (iConfigs != 1))
{
printf("Error: eglChooseConfig() failed.\n");
goto cleanup;
}
// Step 6 - Create a surface to draw to.
EGLSurface eglSurface;
eglSurface = eglCreateWindowSurface(eglDisplay, eglConfig, (EGLNativeWindowType)NULL, NULL);
if (!TestEGLError("eglCreateWindowSurface")) goto cleanup;
// Step 7 - Create a context.
eglContext = eglCreateContext(eglDisplay, eglConfig, NULL, ai32ContextAttribs);
if (!TestEGLError("eglCreateContext")) goto cleanup;
// Step 8 - Bind the context to the current thread
eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext);
if (!TestEGLError("eglMakeCurrent")) goto cleanup;
{
// create a framebuffer object
glGenFramebuffers(1, &fboId);
glBindFramebuffer(GL_FRAMEBUFFER, fboId);
// create a texture object
GLuint textureId;
glGenTextures(1, &textureId);
glBindTexture(GL_TEXTURE_2D, textureId);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); //GL_LINEAR_MIPMAP_LINEAR
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
//glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP_HINT, GL_TRUE); // automatic mipmap
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, renderBufferWidth, renderBufferHeight, 0,
GL_RGB, GL_UNSIGNED_BYTE, 0);
//glBindTexture(GL_TEXTURE_2D, 0);
// attach the texture to FBO color attachment point
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
GL_TEXTURE_2D, textureId, 0);
// check FBO status
GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if(status != GL_FRAMEBUFFER_COMPLETE) {
printf("Problem with OpenGL framebuffer after specifying color render buffer: \n%x\n", status);
} else {
printf("FBO creation succedded\n");
}
}
// Sets the clear color.
// The colours are passed per channel (red,green,blue,alpha) as float values from 0.0 to 1.0
glClearColor(0.6f, 0.8f, 1.0f, 1.0f); // clear blue
// We're going to draw a triangle to the screen so create a vertex buffer object for our triangle
{
// Interleaved vertex data
GLfloat afVertices[] = { -0.4f,-0.4f,0.0f, // Position
0.4f ,-0.4f,0.0f,
0.0f ,0.4f ,0.0f};
// Generate the vertex buffer object (VBO)
glGenBuffers(1, &ui32Vbo);
// Bind the VBO so we can fill it with data
glBindBuffer(GL_ARRAY_BUFFER, ui32Vbo);
// Set the buffer's data
unsigned int uiSize = 3 * (sizeof(GLfloat) * 3); // Calc afVertices size (3 vertices * stride (3 GLfloats per vertex))
glBufferData(GL_ARRAY_BUFFER, uiSize, afVertices, GL_STATIC_DRAW);
}
// Draw a triangle
{
glClear(GL_COLOR_BUFFER_BIT);
if (!TestEGLError("glClear")) goto cleanup;
// First gets the location of that variable in the shader using its name
int i32Location = glGetUniformLocation(uiProgramObject, "myPMVMatrix");
// Then passes the matrix to that variable
glUniformMatrix4fv( i32Location, 1, GL_FALSE, pfIdentity);
/*
Enable the custom vertex attribute at index VERTEX_ARRAY.
We previously binded that index to the variable in our shader "vec4 MyVertex;"
*/
glEnableVertexAttribArray(VERTEX_ARRAY);
// Sets the vertex data to this attribute index
glVertexAttribPointer(VERTEX_ARRAY, 3, GL_FLOAT, GL_FALSE, 0, 0);
/*
Draws a non-indexed triangle array from the pointers previously given.
This function allows the use of other primitive types : triangle strips, lines, ...
For indexed geometry, use the function glDrawElements() with an index list.
*/
glDrawArrays(GL_TRIANGLES, 0, 3);
if (!TestEGLError("glDrawArrays")) goto cleanup;
// get the image data
long imageSize = x * y * 3;
unsigned char *data = new unsigned char[imageSize];
glReadPixels(0,0,x,y,GL_RGB,GL_UNSIGNED_BYTE,data);
最佳答案
解决方案如下(没有错误处理):
#ifdef CONTEXT_ES20
EGLint ai32ContextAttribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2,
EGL_NONE };
#endif
// Step 1 - Get the default display.
eglDisplay = eglGetDisplay((EGLNativeDisplayType)0);
// Step 2 - Initialize EGL.
eglInitialize(eglDisplay, 0, 0);
#ifdef CONTEXT_ES20
// Step 3 - Make OpenGL ES the current API.
eglBindAPI(EGL_OPENGL_ES_API);
// Step 4 - Specify the required configuration attributes.
EGLint pi32ConfigAttribs[5];
pi32ConfigAttribs[0] = EGL_SURFACE_TYPE;
pi32ConfigAttribs[1] = EGL_WINDOW_BIT;
pi32ConfigAttribs[2] = EGL_RENDERABLE_TYPE;
pi32ConfigAttribs[3] = EGL_OPENGL_ES2_BIT;
pi32ConfigAttribs[4] = EGL_NONE;
#else
EGLint pi32ConfigAttribs[3];
pi32ConfigAttribs[0] = EGL_SURFACE_TYPE;
pi32ConfigAttribs[1] = EGL_WINDOW_BIT;
pi32ConfigAttribs[2] = EGL_NONE;
#endif
// Step 5 - Find a config that matches all requirements.
int iConfigs;
eglChooseConfig(eglDisplay, pi32ConfigAttribs, &eglConfig, 1,
&iConfigs);
if (iConfigs != 1) {
printf("Error: eglChooseConfig(): config not found.\n");
exit(-1);
}
// Step 6 - Create a surface to draw to.
EGLSurface eglSurface;
eglSurface = eglCreateWindowSurface(eglDisplay, eglConfig,
(EGLNativeWindowType)NULL, NULL);
// Step 7 - Create a context.
#ifdef CONTEXT_ES20
eglContext = eglCreateContext(eglDisplay, eglConfig, NULL,
ai32ContextAttribs);
#else
eglContext = eglCreateContext(eglDisplay, eglConfig, NULL, NULL);
#endif
// Step 8 - Bind the context to the current thread
eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext);
关于opengl-es-2.0 - 用于 FBO 渲染的 OpenGL ES2.0 离屏上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12662227/
我有以下 OpenGL 设置来解决帧缓冲区问题: 我将立方体渲染到帧缓冲区中。 我使用此帧缓冲区中的目标纹理绘制带纹理的四边形,它在我的视口(viewport)中显示立方体。 当流程的两个阶段都在同一
我一直在研究乒乓球着色,并认为在我上一个问题之后我已经破解了它。但是,随着对着色器的进一步了解,看起来虽然我能够在 FBO A 和 FBO B 上运行着色器,但 A 的输出并未用作 B 的源。换句话说
平台是iPhone OpenGL ES 2.0 框架已经创建了一个带有渲染缓冲区的主fbo,因为它是颜色附件。 我有自己的 fbo ,其中 texture2D 作为颜色附件。我想将主 fbo 的内容复
我有一个应用程序需要执行以下操作: 将纹理从磁盘加载到 GL 纹理 在其上运行图像过滤器(通过 FBO 将其渲染到另一个纹理上) 在屏幕上显示生成的纹理 我有那么多工作。 接下来,我希望能够将第 2
我正在尝试创建一个 FBO 来绘制 3D 场景,并创建另一个 FBO 来绘制 HUD。然后,我尝试通过将 3D 场景 block 传输到默认 FBO,然后将 HUD block 传输到默认 FBO,来
除了默认的帧缓冲区之外,在什么情况下我希望在 OpenGL FBO 中添加渲染缓冲区附件而不是纹理附件?因为,纹理附件似乎更加通用。 最佳答案 纹理为您提供更多功能(采样!、格式多样性),因此更有可能
我正在考虑重构我的渲染代码的很大一部分,然后我想到了一个问题:是否可以使用帧缓冲区对象中的多个颜色附件渲染到屏幕和纹理?尽管它有许多有用的应用程序,但我找不到任何信息是否可能。我想将我的纹理作为颜色a
我尝试在 OpenGL 中使用 FBO 的模板缓冲区,但无法正常工作。我将深度和模板目标的 depth24_stencil8 纹理绑定(bind)到 FBO。作为一个简单的测试,我尝试了: /* En
到目前为止,在对自定义 FBO 进行深度测试时,我一直在使用渲染缓冲区。现在我需要用深度纹理替换它们(因为我需要在着色器中读取它)。我正在查看不同的来源,如 here并看到 GL_FLOAT 用作数据
我现在正在尝试实现阴影贴图几天,我想我开始看到手头的真正问题:我有一个附加了深度纹理的 FBO,用于阴影贴图的光 channel ,但是其中没有任何内容被渲染。甚至没有硬编码值。 我已经仔细检查了程序
我正在尝试关注 ThinMatrix's water tutorial 。为此,我需要创建一个 FBO 并将其渲染为纹理。 但是正如您所看到的,水是完全黑色的: 我正在使用source code pr
我正在使用 A FBO 捕捉四边形表面上方的反射。前提是将相机移动到水面下然后渲染场景到fbo,然后恢复到原来的观看位置,像这样: WaterFrameBuffer fbos; Water test(
我有一个按以下方式创建的 FBO: glGenRenderbuffers(1, &m_depthStencilBuffer); glBindRenderbuffer(GL_RENDERBUFFER,
我无法使用 glreadpixels 函数从深度纹理读取正确的深度值。 FBO 状态完成。其他渲染目标在传输到另一个 FBO 后看起来也很好。 代码片段: // Create the FBO
我正在尝试将多采样场景渲染为纹理,这是我正在使用的代码。我得到一个黑屏。我在 init 结束时检查了 fbo 的完整性,他们报告两个 fbo 都是完整的。 void init_rendered_FBO
我读到在分层渲染中,我们创建了一个 2D 纹理数组(GL_TEXTURE_2D_ARRAY): glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTU
我在网上看到了很多示例(for example),它们执行以下操作 创建和绑定(bind) FBO 创建和绑定(bind)缓冲区 (纹理、渲染、深度、模板) 然后,解除绑定(bind)缓冲区 要使用
我想使用片段着色器输出到 FBO,然后将其纹理附件绘制到默认帧缓冲区。最终,我希望能够输出到一个 FBO,然后使用另一个着色器将其传递给另一个 FBO,依此类推。但我认为让它在默认帧缓冲区上工作是一个
在我的渲染器中,我在多重采样的 FBO 上生成抗锯齿场景,该场景被位 block 传输到颜色附件为纹理的 FBO。然后在渲染到帧缓冲区期间读取纹理。 我想更新它,以便获得 Gamma 正确的结果。使用
我想将图像处理 OpenGL 着色器程序的输出保存到图像文件中,并在屏幕上显示结果。我知道如何使用 glReadPixels() 保存窗口帧缓冲区。然而,屏幕的分辨率小于图像的尺寸。 如果我渲染到 F
我是一名优秀的程序员,十分优秀!