我需要从纹理中获取特定坐标的颜色。有两种方法可以做到这一点,通过获取并查看原始png数据,或者通过对我生成的opengl纹理进行采样。是否有可能在一个给定的UV或XY坐标上采样opengl纹理来获取颜色(RGBA)?如果是这样,怎么样?Open GL中的纹理采样
1
A
回答
2
关闭我的头顶,你的选择是
- 取使用glGetTexImage(整个纹理),并检查你感兴趣的纹理像素
- 平局。您感兴趣的纹理元素(例如,通过渲染GL_POINTS基元),然后使用glReadPixels获取从帧缓冲区渲染它的像素。
- 方便地保留纹理图像的副本,并将OpenGL保留在其外面。
选项1和2的效率非常低(尽管通过使用像素缓冲区对象并异步执行副本,速度可能会有所提高)。所以我最喜欢的是FAR选项3
编辑:如果有GL_APPLE_client_storage
扩展名(即您是Mac或iPhone上。)那么这就是选择4这是一个很长的路要走赢家。
2
我发现最有效的方法是访问纹理数据(您应该将我们的PNG解码为纹理),并在纹理之间进行插值。假设您的texcoords为[0,1],请将texwidth u和texheight v相乘,然后使用它来查找纹理上的位置。如果它们是整数,则直接使用该像素,否则使用int部分来查找边界像素并根据小数部分进行插值。
这里有一些类似HLSL的伪码。应该是相当清楚的:
float3 sample(float2 coord, texture tex) {
float x = tex.w * coord.x; // Get X coord in texture
int ix = (int) x; // Get X coord as whole number
float y = tex.h * coord.y;
int iy = (int) y;
float3 x1 = getTexel(ix, iy); // Get top-left pixel
float3 x2 = getTexel(ix+1, iy); // Get top-right pixel
float3 y1 = getTexel(ix, iy+1); // Get bottom-left pixel
float3 y2 = getTexel(ix+1, iy+1); // Get bottom-right pixel
float3 top = interpolate(x1, x2, frac(x)); // Interpolate between top two pixels based on the fractional part of the X coord
float3 bottom = interpolate(y1, y2, frac(x)); // Interpolate between bottom two pixels
return interpolate(top, bottom, frac(y)); // Interpolate between top and bottom based on fractional Y coord
}
0
正如其他人所建议的,从VRAM回读纹理效率非常低,如果您甚至对性能感兴趣,应该像瘟疫一样避免。据
两个可行的解决方案,因为我知道:
- 使用着色器选项2的
相关问题
- 1. Open GL Es1.0纹理参数?
- 2. 将颜色应用于Open-GL纹理
- 3. Android Open GL ES非POT纹理
- 4. Open GL ES透明纹理不混合
- 5. Android Open GL ES纹理问题
- 6. Android Open GL ES纹理搞砸了
- 7. Open GL ES 2.0 Android底纹
- 8. 多重采样纹理采样
- 9. mipmapped纹理如何采样?
- 10. Open GL纹理,纹理坐标对于呈现的内容不正确
- 11. 如何利用Open GL ES 1.1做多纹理Android中
- 12. 在纹理中画一条线Open GL ES 2.0 Android
- 13. OpenGL中的3D纹理采样
- 14. 为什么我的OPEN GL ES纹理不显示
- 15. 具有2个纹理的Open GL着色器
- 16. 解开Open GL ES纹理的正确方法?
- 17. 程序GL纹理
- 18. 在framebuffer中渲染多重采样和单采样纹理
- 19. Open GL
- 20. Open GL ES内存管理
- 21. Android Open GL理论问题
- 22. Android OPEN GL ES多纹理不会画任何东西
- 23. Open GL - 如何从像素缓冲区加载纹理
- 24. Open gl es如何提高性能,渲染纹理,混合
- 25. Open GL ES png纹理呈现为黑色
- 26. 纹理尺寸限制? Android Open GL ES 2.0
- 27. Open GL ES - 纹理与阿尔法清除背景
- 28. 的DirectX 9 HLSL纹理采样问题
- 29. 从多采样纹理到非多采样
- 30. 开放GL选择纹理
外保持PixelData取出方便(浪费内存虽然)