readpixels
时间: 2023-07-31 22:04:32 浏览: 14
readpixels是一个WebGL API,用于读取WebGL绘图上下文中指定矩形区域的像素值。它的语法如下:
```javascript
gl.readPixels(x, y, width, height, format, type, pixels);
```
其中,x和y是矩形左下角的坐标,width和height是矩形的宽度和高度,format是像素数据的颜色格式,type是像素数据的数据类型,pixels是接收像素数据的数组。通过调用readpixels方法,我们可以获取到绘图上下文中指定矩形区域的像素值,从而实现一些图像处理的功能。
相关问题
UE4 将ReadPixels的内容保存到数组中(C++实现)
在UE4中,可以通过以下步骤将ReadPixels的内容保存到数组中:
1. 创建一个RenderTarget2D对象,并将其设置为需要读取像素的渲染目标。例如:
```cpp
UTextureRenderTarget2D* RenderTarget = NewObject<UTextureRenderTarget2D>();
RenderTarget->InitAutoFormat(Width, Height);
```
2. 在需要读取像素的时候,使用RenderTarget作为渲染目标,并使用SceneCaptureComponent2D组件进行截图。例如:
```cpp
USceneCaptureComponent2D* SceneCapture = NewObject<USceneCaptureComponent2D>();
SceneCapture->TextureTarget = RenderTarget;
SceneCapture->Activate();
FViewport* Viewport = GEngine->GameViewport->Viewport;
Viewport->Draw();
FTextureRenderTargetResource* RTResource = RenderTarget->GameThread_GetRenderTargetResource();
FReadSurfaceDataFlags ReadPixelFlags(RCM_UNorm, CubeFace_MAX);
ReadPixelFlags.SetLinearToGamma(true);
TArray<FColor> PixelData;
RTResource->ReadPixels(PixelData, ReadPixelFlags);
```
3. 最后,将像素数据保存到一个数组中,即可完成ReadPixels的内容保存。例如:
```cpp
uint32 Size = Width * Height;
uint8* Data = (uint8*)FMemory::Malloc(Size * 4);
for (uint32 i = 0; i < Size; i++)
{
Data[i * 4] = PixelData[i].R;
Data[i * 4 + 1] = PixelData[i].G;
Data[i * 4 + 2] = PixelData[i].B;
Data[i * 4 + 3] = PixelData[i].A;
}
```
注意:以上代码仅供参考,具体实现需要根据项目的实际情况进行调整。
ReadPixels was called to read pixels from system frame buffer, while not inside drawing frame.
这个错误通常是因为尝试在渲染帧之外调用`ReadPixels`函数所导致的。Unity的渲染管线在每个帧之间进行同步,所以你必须在渲染帧时调用`ReadPixels`函数才能正确地读取像素数据。
为了解决这个问题,你可以将`ReadPixels`函数的调用移到`OnPostRender()`函数中。`OnPostRender()`函数是在每个Camera完成渲染之后调用的,因此在这里调用`ReadPixels`函数就可以保证它在渲染帧时被正确调用。以下是修改后的示例代码:
```
using UnityEngine;
public class ScreenRecorder : MonoBehaviour
{
public int captureWidth = 1920;
public int captureHeight = 1080;
public int captureFPS = 30;
public string fileName = "ScreenShot";
public bool isRecording = false;
private int frameCount = 0;
private Texture2D texture;
void Start()
{
Screen.SetResolution(captureWidth, captureHeight, false);
Time.captureFramerate = captureFPS;
}
void Update()
{
if (isRecording)
{
// Do something to start recording
}
}
void OnPostRender()
{
if (isRecording)
{
string path = Application.dataPath + "/" + fileName + "_" + frameCount.ToString("0000") + ".png";
texture = new Texture2D(captureWidth, captureHeight, TextureFormat.RGB24, false);
texture.ReadPixels(new Rect(0, 0, captureWidth, captureHeight), 0, 0);
texture.Apply();
byte[] bytes = texture.EncodeToPNG();
System.IO.File.WriteAllBytes(path, bytes);
frameCount++;
}
}
}
```
在这个修改后的示例中,我们将`ReadPixels`函数的调用移到了`OnPostRender()`函数中,并且在`Update()`函数中只是设置了一个标志来指示是否正在录制。这样做可以确保`ReadPixels`函数只在渲染帧时被调用,避免了上述错误的发生。