【opengles】笔记1:屏幕坐标与归一化坐标(NDC)的转换

参考资料

OpenGL希望在所有顶点着色器运行后,所有我们可见的顶点都变为标准化设备坐标(Normalized Device Coordinate, NDC)。也就是说,每个顶点的x,y,z坐标都应该在-1.0到1.0之间,超出这个坐标范围的顶点都将不可见。

屏幕的中心点是(0,0)三个坐标轴的范围都是(-1.0,1.0)这样的坐标系是NDC坐标系

屏幕坐标系是指左上角为(0,0),单位长度是1个像素,右下角的坐标是(width,height)的坐标系,比如宽800,高600的屏幕左下角的坐标是(800,600)。

着色器和描画等操作的坐标还是NDC坐标,如果使用屏幕坐标系,描画时需要转换为NDC。

转换关系如下

由上述公式可以得到下面四个函数

```c
int x_ndc_to_screen(float x)
{
	return (x+1)*0.5f*SCREEN_WIDTH;
}

int y_ndc_to_screen(float y)
{
	return (1-y)*0.5f*SCREEN_HEIGHT;
}

float x_screen_to_ndc(int x)
{
	return (x*2)/800.0-1;
}

float y_screen_to_ndc(int y)
{
	return 1-(y*2)/600.0;
}

在描画时调用即可

创作不易,扫个红包吧

相关推荐
凌云行者15 小时前
OpenGL入门008——环境光在片段着色器中的应用
c++·cmake·opengl
闲暇部落5 天前
Android OpenGL ES详解——立方体贴图
opengl·天空盒·立方体贴图·环境映射·动态环境贴图
闲暇部落5 天前
Android OpenGL ES详解——实例化
android·opengl·实例化·实例化数组·小行星带
闲暇部落8 天前
Android OpenGL ES详解——几何着色器
opengl·法线·法向量·几何着色器
刘好念12 天前
[OpenGL]使用OpenGL实现硬阴影效果
c++·计算机图形学·opengl
闲暇部落13 天前
Android OpenGL ES详解——纹理:纹理过滤GL_NEAREST和GL_LINEAR的区别
opengl·texture·linear·纹理过滤·nearest·邻近过滤·线性过滤
凌云行者14 天前
OpenGL入门005——使用Shader类管理着色器
c++·cmake·opengl
凌云行者14 天前
OpenGL入门006——着色器在纹理混合中的应用
c++·cmake·opengl
凌云行者17 天前
OpenGL入门004——使用EBO绘制矩形
c++·cmake·opengl
闲暇部落18 天前
Android OpenGL ES详解——模板Stencil
android·kotlin·opengl·模板测试·stencil·模板缓冲·物体轮廓