标签: framebuffer

读取屏幕的一个像素(即1024*768,你现在可以看到)

在Windows XP中,C编程语言

我想快速读取屏幕的一个像素(即你现在可以看到的1024*768)

我认为帧缓冲是解决方案.

所以

我试过了

#include "SDL.h"
#include <stdio.h>
#include <time.h>

SDL_Surface *screen;

int main(int argc, char *argv[])
{
  if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) 
  {
    fprintf(stderr, "Unable to init SDL: %s\n", SDL_GetError());
    exit(1);
  }
  screen = SDL_GetVideoSurface();
  if ( screen == NULL ) 
  {
    exit(1);
  }

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

但屏幕似乎是NULL

对不起新问题

但有人可以告诉我如何访问framebuffer来读取像素吗?

欢迎任何可能的方式

c desktop framebuffer pixel

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

Python Webkit使用虚拟帧缓冲区制作网站截图

问题是我需要捕获网站截图而不运行X服务器.

因此理论上可以创建虚拟帧缓冲区并使用它来捕获屏幕截图.

有没有类似的解决方案,任何建议将不胜感激?

苏丹

python webkit framebuffer pyqt4

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

来自OpenGL ES framebuffer(iOS)的CGImageRef

如何使用glReadPixels从EAGLView的帧缓冲内容中有效地创建CGImageRef?也许我可以"直接渲染到纹理"?

我对OpenGL ES比较陌生,所以非常感谢任何帮助!

opengl-es framebuffer ios

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

OpenGL ES 2.x:如何丢弃深度缓冲区glDiscardFramebufferEXT?

我阅读了iOS OpenGL ES逻辑缓冲区加载,通过在每个绘制周期后"丢弃"深度缓冲区可以达到性能增益.我试试这个,但这是因为我的游戏引擎不再渲染.当我尝试渲染下一个循环时,我得到一个glError 1286或GL_INVALID_FRAMEBUFFER_OPERATION_EXT.

如果我要丢弃它,我感觉我需要在每个周期初始化或设置深度缓冲区,但我似乎无法找到任何相关信息.这是我如何初始化深度缓冲区(实际上是所有缓冲区):

    // ---- GENERAL INIT ---- //        
    // Extract width and height.
    int bufferWidth, bufferHeight;
    glGetRenderbufferParameteriv(GL_RENDERBUFFER,
                                 GL_RENDERBUFFER_WIDTH, &bufferWidth);
    glGetRenderbufferParameteriv(GL_RENDERBUFFER,
                                 GL_RENDERBUFFER_HEIGHT, &bufferHeight);

    // Create a depth buffer that has the same size as the color buffer.
    glGenRenderbuffers(1, &m_depthRenderbuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, m_depthRenderbuffer);
    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24_OES, GAMESTATE->GetViewportSize().x, GAMESTATE->GetViewportSize().y);

    // Create the framebuffer object.
    GLuint framebuffer;
    glGenFramebuffers(1, &framebuffer);
    glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
                              GL_RENDERBUFFER, m_colorRenderbuffer);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
                              GL_RENDERBUFFER, m_depthRenderbuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, m_colorRenderbuffer);
Run Code Online (Sandbox Code Playgroud)

以下是我想要在每个绘制周期结束时丢弃深度缓冲区的方法:

    // Discard the depth buffer
    const GLenum discards[]  = …
Run Code Online (Sandbox Code Playgroud)

iphone opengl-es framebuffer depth-buffer

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

如何渲染到OpenGL Cubemap纹理的一面

我正在制作一个立方体贴图渲染目标类。我已经有一个2D的作品了。但是对于这个立方体贴图渲染目标类,我希望能够根据需要渲染到特定的面孔。也许我想在“ X +”面上渲染圆,但在“ Y +”面上渲染三角形。

这是我班的样子

class CRenderTarget 
{
private:
    //frame buffer to render on
    unsigned  m_uifboHandle;

    //depth stencil 
    unsigned  m_uiDepthStencilHandle;

    //the texture we will render on
    unsigned  m_uiTextureHandle;

public:
    CCubeRenderTarget( void );

    ~CCubeRenderTarget( void );

    void Create( unsigned uiHeightWidth = 512,
             int iInternalFormat = 0x1908 ); //GL_RGBA

    void Bind( void );

    void UnBind( void );
}
Run Code Online (Sandbox Code Playgroud)

这就是我的create函数的样子

void Create( unsigned uiHeightWidth, int iInternalFormat )
{
        //generate our variables
    glGenFramebuffers(1, &m_uifboHandle);
    glGenRenderbuffers(1, &m_uiDepthStencilHandle);
    glGenTextures(1, &m_uiTextureHandle);

    // Initialize FBO
    glBindFramebuffer( GL_FRAMEBUFFER, …
Run Code Online (Sandbox Code Playgroud)

opengl framebuffer rendertarget

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

libgdx中帧缓冲区的结果不明确

我在libgdx中使用FrameBuffer类得到以下奇怪的结果.

在此输入图像描述

以下是产生此结果的代码:

// This is the rendering code
@Override
public void render(float delta) {
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);

    stage.act();
    stage.draw();

    fbo.begin();
    batch.begin();
    batch.draw(heart, 0, 0);
    batch.end();
    fbo.end();  

    test = new Image(fbo.getColorBufferTexture());
    test.setPosition(256, 256);
    stage.addActor(test);
}

//This is the initialization code
@Override
public void show() {
    stage = new Stage(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), false);
    atlas = Assets.getAtlas();
    batch = new SpriteBatch();

    background = new Image(atlas.findRegion("background"));     
    background.setFillParent(true); 
    heart = atlas.findRegion("fluttering");
    fbo = new FrameBuffer(Pixmap.Format.RGBA8888, heart.getRegionWidth(), heart.getRegionHeight(), false);

    stage.addActor(background);
    Image temp = new Image(new …
Run Code Online (Sandbox Code Playgroud)

opengl fbo opengl-es framebuffer libgdx

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

THREE.js模糊帧缓冲区

我需要模糊帧缓冲区,我不知道如何使用THREE.js获取帧缓冲区.

我想模糊整个帧缓冲区,而不是模糊场景中的每个纹理.所以我想我应该读取帧缓冲区然后模糊,而不是在着色器中执行此操作.

这是我尝试过的:

初始化时调用:

var renderTarget = new THREE.WebGLRenderTarget(512, 512, {
    wrapS: THREE.RepeatWrapping,
    wrapT: THREE.RepeatWrapping,
    minFilter: THREE.NearestFilter,
    magFilter: THREE.NearestFilter,
    format: THREE.RGBAFormat,
    type: THREE.FloatType,
    stencilBuffer: false,
    depthBuffer: true
});
renderTarget.generateMipmaps = false;
Run Code Online (Sandbox Code Playgroud)

每帧调用:

var gl = renderer.getContext();

// render to target
renderer.render(scene, camera, renderTarget, false);
framebuffer = renderTarget.__webglFramebuffer;
console.log(framebuffer);

gl.flush();
if (framebuffer != null)
    gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);
var width = height = 512;
var rdData = new Uint8Array(width * height * 4);
gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, rdData);
console.log(rdData);

// …
Run Code Online (Sandbox Code Playgroud)

shader framebuffer glsl three.js

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

渲染到深度纹理 - 关于GL_OES_depth_texture使用的不清晰度

我正在尝试替换gl_FragDepthOpenGL ES 2.0中缺少的OpenGL功能.

我需要一种在片段着色器中设置深度的方法,因为在顶点着色器中设置它对于我的目的来说不够准确.AFAIK唯一的方法是使用渲染到纹理的帧缓冲区,在其上完成第一个渲染过程.该深度纹理存储屏幕上每个像素的深度值.然后,深度纹理附加在最终渲染过程中,因此最终渲染器知道每个像素的深度.

由于iOS> = 4.1支持GL_OES_depth_texture,我正在尝试使用GL_DEPTH_COMPONENT24GL_DEPTH_COMPONENT16用于深度纹理.我正在使用以下调用来创建纹理:

glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, width, height, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, textureId, 0);
Run Code Online (Sandbox Code Playgroud)

帧缓冲区创建成功,但我不知道如何继续.我对附加到帧缓冲区的深度纹理缺乏一些基本的了解.

  • 我应该在片段着色器中输出什么值?我的意思gl_FragColor是,即使纹理是深度纹理,仍然是RGBA值.我无法在片段着色器中设置深度,因为gl_FragDepth在OpenGL ES 2.0中缺少
  • 如何从最终渲染过程中的深度纹理中读取深度纹理作为sampler2D
  • 为什么我得到一个不完整的帧缓冲,如果我设置的第三个参数glTexImage2DGL_DEPTH_COMPONENT16,GL_DEPTH_COMPONENT16_OES还是GL_DEPTH_COMPONENT24_OES
  • 将纹理附加到GL_DEPTH_ATTACHMENT?是否正确?如果我改变它GL_COLOR_ATTACHMENT0,我得到一个不完整的帧缓冲.

opengl-es framebuffer depth-buffer opengl-es-2.0

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

libgdx嵌套了FrameBuffer

我在我的LevelScreen渲染方法中使用FBO渲染多遍模糊着色器.我想要实现的是制作一个MenuScreen,在背景上渲染LevelScreen,在其上应用另一个模糊效果.

这是伪代码

    protected void render(float delta) {
        // render the scene to the FBO
        fbo.begin();
        levelScreen.render(delta);
        fbo.end();

        // retrieve texture and flip Y
        Sprite background = new Sprite(fbo.getColorBufferTexture());
        background.flip(false, true);

        // apply the blurX shader and
        // render the sprite
        batch.setShader(blurH);
        batch.begin();
        background.draw(batch);
        batch.end();
    }
Run Code Online (Sandbox Code Playgroud)

问题是该levelScreen.render()函数已经包含a fbo.begin() fbo.end()并且场景直接在屏幕上呈现.

有没有办法处理正确嵌套的fbo?

framebuffer glsl game-engine libgdx

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

使用QOpenGLWidget进行屏幕外渲染的最简单方法

我有一个隐藏的QOpenGLWidget(Qt 5.4.2,不是QGLWidget),我想基本上不断地使用grab()或grabFramebuffer()来获取其内容(并将其写入磁盘).窗口小部件在可见时呈现正常,但在隐藏时不呈现.如果我执行show()后跟hide()调用它可以工作.这看起来很奇怪,因为QOpenGLWidget在内部已根据文档渲染到帧缓冲区.实现这一目标的最简单方法是什么(如果可能的话,不创建另一个帧缓冲区)?
能够使用QOpenGLWidget作为其视口捕获屏幕外QGraphicsView的加分点,其中包含自定义OpenGL绘制的QGraphicsItems ...

opengl qt framebuffer off-screen

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