openGL之API学习(一五五)glsl中mod的奇怪结果

在GLSL中,发现mod函数对于某些整数操作产生非预期结果,例如mod(2049, 2)返回0而非1。问题源于GLSL的mod不接受整型参数,只接受浮点类型,导致结果有时会加1但不小于除数时调整为0。修正此问题的方法是将所有参数转换为浮点类型,如mod(2049.0, 2.0)。" 107605399,9807201,IntelliJ IDEA Debug 深度解析,"['IntelliJ IDEA', '调试工具', '开发技巧', 'Java开发']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mod(2048,10)的结果为8

 

mod(2049.0,10.0)的结果为9.0

mod(249,10)的结果为9

 

 

mod(2049,1)的结果为0,正确。

mod(2049,2)的结果为0,而不是1,奇怪之处!!!!!!!!!!!

mod(2049,3)的结果为0,正确。

mod(2049,4)的结果为2,而不是1,奇怪之处!!!!!!!!!!!

mod(2049,5)的结果为0,而不是4,奇怪之处!!!!!!!!!!!

mod(2049,6)的结果为4,而不是3,奇怪之处!!!!!!!!!!!

mod(2049,7)的结果为6,而不是5,奇怪之处!!!!!!!!!!!

mod(2049,8)的结果为2,而不是1,奇怪之处!!!!!!!!!!!

mod(2049,9)的结果为7,而不是6,奇怪之处!!!!!!!!!!!

mod(2049,10)的结果为0,而不是9,奇怪之处!!!!!!!!!!

只要能被2049整除的都没问题,不能整除的为正确余数加1,增加的数值不小于除数的调整为0

 

上述奇怪之处改为如下形式就恢复正常了:

mod(2049.0,8.0)结果为1.0

mod的定义是这样的:

genType mod( 	genType x,
  	float y);
 
genType mod( 	genType x,
  	genType y);
 
genDType mod( 	genDType x,
  	double y);
 
genDType mod( 	genDType x,
  	genDType y);

genType指的是float, vec2, vec3, or vec4

genDType指的是double, dvec2, dvec3, or dv

OpenGL是一种强大的图形渲染API,但它本身并不直接提供画虚线的功能。通常,我们会在顶点数据和着色器中进行处理来模拟虚线效果。下面是一个简单的示例,展示如何通过设置顶点颜色和片段着色器来在OpenGL ES 2.0中绘制矩形的虚线。这个例子假设你已经设置了好基本的OpenGL上下文和纹理。 首先,你需要准备顶点数据,例如两个三角形网格,每个网格代表实线和虚线部分: ```cpp // 实线部分 (x1, y1, x2, y2) GLfloat solidVertices[] = { -0.5f, 0.5f, // 左上 0.5f, 0.5f, // 右上 0.5f, -0.5f, // 右下 -0.5f, -0.5f // 左下 }; // 虚线部分,可以设置间距和线条宽度 GLfloat dottedVertices[] = { -0.5f, 0.4f, // 左上 0.5f, 0.4f, // 右上 0.5f, -0.6f, // 右下 -0.5f, -0.6f // 左下 }; const int numVertices = sizeof(solidVertices) / sizeof(GLfloat); ``` 然后在着色器中,你可以创建一个条件语句来判断当前是否应该显示虚线。这里以片段着色器为例: ```glsl #version 330 core out vec4 FragColor; uniform float lineWidth; uniform float gapSize; in vec2 vertPos; void main() { float dist = mod(vertPos.x * lineWidth + vertPos.y * gapSize, lineWidth); // 对应于直线的距离 if (dist < lineWidth / 2.) { // 如果距离小于半线宽,绘制实线 FragColor = vec4(1.0f, 1.0f, 1.0f, 1.0f); // 设置颜色 } else { FragColor = vec4(0.0f, 0.0f, 0.0f, 1.0f); // 否则绘制透明 } } ``` 最后,在应用着色器并设置顶点缓冲后,你可以像平时一样提交这些顶点到管线: ```cpp glUseProgram(shaderProgram); // 绑定顶点数组 glBindVertexArray(lineVao); glVertexAttribPointer(vertexLoc, 2, GL_FLOAT, GL_FALSE, 0, solidVertices); glEnableVertexAttribArray(vertexLoc); // 绘制实线部分 glDrawArrays(GL_TRIANGLES, 0, numVertices); // 清除并切换到虚线顶点 glBindVertexArray(dottedVao); glVertexAttribPointer(vertexLoc, 2, GL_FLOAT, GL_FALSE, 0, dottedVertices); glDrawArrays(GL_TRIANGLES, 0, numVertices); glBindVertexArray(0); glUseProgram(0); ``` 请注意,这只是一个基础的演示,实际使用时可能需要根据需求调整细节,比如动态控制虚线样式和性能优化等。同时,这只是在顶点级别处理虚线,如果需要更精细的效果,可能还需要考虑纹理或者后期处理技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值