在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来读取像素吗?
欢迎任何可能的方式
问题是我需要捕获网站截图而不运行X服务器.
因此理论上可以创建虚拟帧缓冲区并使用它来捕获屏幕截图.
有没有类似的解决方案,任何建议将不胜感激?
苏丹
如何使用glReadPixels从EAGLView的帧缓冲内容中有效地创建CGImageRef?也许我可以"直接渲染到纹理"?
我对OpenGL ES比较陌生,所以非常感谢任何帮助!
我阅读了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) 我正在制作一个立方体贴图渲染目标类。我已经有一个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) 我在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) 我需要模糊帧缓冲区,我不知道如何使用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) 我正在尝试替换gl_FragDepthOpenGL ES 2.0中缺少的OpenGL功能.
我需要一种在片段着色器中设置深度的方法,因为在顶点着色器中设置它对于我的目的来说不够准确.AFAIK唯一的方法是使用渲染到纹理的帧缓冲区,在其上完成第一个渲染过程.该深度纹理存储屏幕上每个像素的深度值.然后,深度纹理附加在最终渲染过程中,因此最终渲染器知道每个像素的深度.
由于iOS> = 4.1支持GL_OES_depth_texture,我正在尝试使用GL_DEPTH_COMPONENT24或GL_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?glTexImage2D来GL_DEPTH_COMPONENT16,GL_DEPTH_COMPONENT16_OES还是GL_DEPTH_COMPONENT24_OES?GL_DEPTH_ATTACHMENT?是否正确?如果我改变它GL_COLOR_ATTACHMENT0,我得到一个不完整的帧缓冲.我在我的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?
我有一个隐藏的QOpenGLWidget(Qt 5.4.2,不是QGLWidget),我想基本上不断地使用grab()或grabFramebuffer()来获取其内容(并将其写入磁盘).窗口小部件在可见时呈现正常,但在隐藏时不呈现.如果我执行show()后跟hide()调用它可以工作.这看起来很奇怪,因为QOpenGLWidget在内部已根据文档渲染到帧缓冲区.实现这一目标的最简单方法是什么(如果可能的话,不创建另一个帧缓冲区)?
能够使用QOpenGLWidget作为其视口捕获屏幕外QGraphicsView的加分点,其中包含自定义OpenGL绘制的QGraphicsItems ...
framebuffer ×10
opengl-es ×4
opengl ×3
depth-buffer ×2
glsl ×2
libgdx ×2
c ×1
desktop ×1
fbo ×1
game-engine ×1
ios ×1
iphone ×1
off-screen ×1
pixel ×1
pyqt4 ×1
python ×1
qt ×1
rendertarget ×1
shader ×1
three.js ×1
webkit ×1