at in on 在时间/地点上分别有什么用法

[以下资料收集自互联网]

at, in和on表示时间时的区别

【in】我是“大姐”,因为我后面所接的都是较长时间。具体用法有:
    1. 表示在较长的时间里(如周/月份/季节/年份/世纪等)。如:in a week; in May; in spring/summer/autumn/winter; in 2008; in the 1990’s等。
    2. 表示在上午、下午或晚上。如:in the morning/afternoon/evening。
    3. in the daytime(在白天) 属于固定搭配,指从日出到日落这一段时间,反义词组是in the night。
    4. “in + 一段时间”表示“多久以后/以内”,常与将来时连用。如:in half an hour; in ten minutes; in a few days等。

【on】我是 “二姐”,我后面所接的时间多与日期有关。具体用法有:
    1. 表示在具体的某一天(如日期、生日、节日或星期几)。如:on May 4th, 1919; on Monday; on Teachers’ Day; on my birthday; on that day等。
    2. 表示某一天的上午、下午或晚上。如:on the morning of July 2; on Sunday afternoon; on a cold winter evening等。

【at】我是“小妹”,因为接在我后面的时间最短。具体用法有:
    1. 表示在某一具体时刻,即几点几分。如:at six o’clock; at half past nine; at a quarter to six; at this time等。
    2. 表示在某一短暂的时间。如:at noon; at this moment; at the end of a year; at the start of the concert等。

用介词at、on、in填空
    1.He came to my family _______ May, 1999.
    2.He got home _______ midnight.
    3.Tree leaves begin to fall _______ September.
    4.He went to Beijing _______ the morning of October 8th.
    5.This matter happened ______ the 1970’s ______ his eighties.
    6.He usually goes to see a film ______ Sunday.
    7.Can you finish the task _______ a month?
    8.He left his homeland _______ the age of thirty.
    9.My family will move there ______ two months.
    10.He is kind to her ______ times.


为了加深记忆,给你连个FLASH你看看~
http://srrc.syepi.edu.cn/hhlt/yufa/FW_atonin.swf

 

 

 

at, in和on表示地点时的区别

1. at表示地点:

(1)用于指较小的地方。如: I shall wait for you at the station.

(2)用于门牌号码前。如: He lives at 115 Zhongshan Road.

2. in表示地点:

(1)用于指较大的地方。如: He lives in Shanghai.

(2)虽然是很小的地方,如果说话人住在那里,也可用in。商店、学校、机关等,若看作一个地点(point)用at,若看作一个场所(place)用in。

如:

I met him at the post-office.

I’m now working in the post-office.

3. on表示地点,一般指与面或线接触,意为“在……上;在……旁”。

如:

The picture was hanging on the wall.

New York is on the Hudson River.

<think>我们正在处理一个Shader编译错误:Shader error in 'Unlit/RangeLighting': invalid subscript 'screenUV' at line 118 on d3d11。 根据错误信息,问题出现在第118行,错误是无效的下标'screenUV'。这意味着我们尝试访问一个结构体中不存在的成员。 在Unity Shader中,这种错误通常发生在以下几种情况: 1. 在顶点着色器输出结构体(v2f)中没有声明'screenUV'变量,但在片段着色器中却尝试使用它。 2. 在顶点着色器中虽然声明了'screenUV',但在片段着色器中拼写错误(例如大小写不一致)或者使用了下标访问方式(点号访问)但变量名不正确。 3. 可能混淆了不同的结构体变量,比如在v2f结构体中声明了一个变量,但在片段着色器中却从另一个结构体中访问。 根据引用[2]引用[4]中提到的类似错误(invalid subscript),我们可以推断: - 引用[2]指出:invalid subscript "nromal" 可能是v2f里没有对应的接应它的变量。 - 引用[4]中展示了在访问结构体数组成员时使用了正确的数组名(如boxMax)但可能因为结构体定义中没有该数组而导致错误。 因此,我们首先需要检查第118行附近的代码,确认我们访问的结构体变量是否正确定义。 步骤: 1. 找到第118行的代码,查看是哪个结构体使用了'screenUV'成员。 2. 检查该结构体的定义,确保该成员存在且拼写一致(包括大小写)。 3. 如果结构体中确实没有定义'screenUV',则需要添加;如果拼写错误,则修正。 此外,引用[3]提到了一种重新导入shader的临时解决方法,但根本原因还是代码问题。 由于我们无法直接查看用户的shader代码,我们只能根据常见情况给出建议。 假设第118行代码类似于: fixed4 col = tex2D(_MainTex, i.screenUV); 那么,我们需要在v2f结构体中定义: float2 screenUV : TEXCOORD0; // 或者其他的TEXCOORD语义 如果已经定义了,那么检查在顶点着色器中是否正确地计算了screenUV并赋值。 另外,注意在Unity中,有时我们使用屏幕空间坐标,可以通过ComputeScreenPos函数来计算,然后在片段着色器中使用前需要进行透视除法(除以w分量)。但这里错误是下标无效,所以先解决成员存在的问题。 解决方案: 1. 打开shader文件,定位到第118行,查看具体代码。 2. 找到访问'screenUV'的结构体变量(例如i.screenUV),并查看该结构体(通常是v2f)的定义。 3. 在v2f结构体中,确保有: float2 screenUV : TEXCOORDn; // n为未被占用的索引 4. 在顶点着色器中,计算screenUV的值。例如,如果要获取屏幕空间坐标,可以这样: o.screenUV = ComputeScreenPos(v.vertex); // 注意:这里得到的是齐次坐标,在片段着色器中需要除以w 然后在片段着色器中,使用前需要:float2 uv = i.screenUV.xy / i.screenUV.w; 5. 但是,如果我们在片段着色器中直接使用i.screenUV.xy而不除以w,那么可能会出现扭曲,但不会导致编译错误。而编译错误是下标无效,所以先确保结构体中有这个成员。 如果问题仍然存在,请检查是否有多个结构体(例如,可能有一个用于顶点着色器输出的结构体,另一个用于片段着色器输入,但通常是一个v2f结构体)。确保在同一个结构体中定义。 另外,注意在Unity的Surface Shader中,有时会自动生成结构体,如果我们在自定义的结构体中没有包含screenUV,而自动生成的结构体中也没有,那么就会出错。如果是Surface Shader,可能需要使用Input结构体来定义screenUV。 但是,根据错误信息中的shader名称'Unlit/RangeLighting',这应该是一个Unlit shader,可能是顶点-片段着色器,而不是表面着色器。 因此,我们按照顶点-片段着色器的结构来检查。 总结步骤: 1. 检查v2f结构体是否包含screenUV成员。 2. 检查顶点着色器中是否对screenUV进行了赋值。 3. 检查片段着色器中访问的结构体变量名是否与v2f中定义的完全一致(包括大小写)。 如果确认结构体中存在该成员,但仍然报错,请尝试重新导入shader(如引用[3]所述,右键点击shader文件,选择Reimport),因为有时可能是Unity的缓存问题。 但是,根据经验,重新导入通常解决的是其他问题(比如shader文件外部修改后Unity没有重新编译),而编译错误多数还是代码问题。 因此,重点检查代码结构。 由于没有代码,我们只能给出一般性建议。如果用户能提供相关代码片段,可以更准确地定位问题。 相关问题: 1. 在Unity Shader中,结构体成员变量应该如何正确定义? 2. 如何计算屏幕空间坐标并在片段着色器中使用? 3. Unity Shader编译错误的常见原因有哪些? 4. 如何调试Unity Shader的编译错误? 5. 什么是v2f结构体?它在着色器中的作用是什么?</think>根据错误信息`invalid subscript 'screenUV' at line 118`,结合Unity Shader常见问题,以下是具体原因解决方案: ### 错误原因分析 1. **结构体成员未定义**(最常见) 在`v2f`结构体(顶点着色器到片段着色器的传递结构)中未声明`screenUV`成员变量,但片段着色器试图访问`i.screenUV`[^2][^4]。 2. **语义绑定错误** `screenUV`未正确绑定纹理坐标语义(如`: TEXCOORD0`),导致编译器无法识别[^2]。 3. **变量名拼写/大小写不一致** 结构体中的变量名(如`ScreenUV`)与访问时的名称(`screenUV`)大小写或拼写不匹配[^2]。 4. **Unity版本兼容性问题** 某些Unity版本对Shader结构体成员的严格性检查存在差异,可能引发此错误[^3]。 --- ### 解决方案 #### ✅ 步骤1:检查并补全结构体定义 在`v2f`结构体中明确定义`screenUV`并绑定语义: ```hlsl struct v2f { float4 pos : SV_POSITION; float2 screenUV : TEXCOORD0; // 确保此行存在 // 其他变量... }; ``` #### ✅ 步骤2:验证变量命名一致性 检查结构体定义访问代码的拼写/大小写是否**完全一致**: ```hlsl // 片段着色器中访问 fixed4 frag (v2f i) : SV_Target { float2 uv = i.screenUV; // 必须与结构体中的名称相同 } ``` #### ✅ 步骤3:正确计算屏幕坐标 在顶点着色器中计算屏幕坐标(需包含`UnityCG.cginc`): ```hlsl v2f vert (appdata v) { v2f o; o.pos = UnityObjectToClipPos(v.vertex); o.screenUV = ComputeScreenPos(o.pos); // 计算屏幕坐标 return o; } ``` #### ✅ 步骤4:重新导入Shader(Unity缓存问题) 右键点击Shader文件 → **Reimport**,强制Unity刷新编译[^3]。 --- ### 关键注意事项 1. **语义绑定规则** - 纹理坐标必须使用`TEXCOORDn`语义(`n=0,1,2...`) - 顶点位置必须使用`SV_POSITION` 2. **ComputeScreenPos使用限制** 该函数返回**齐次坐标**(xy/w才是实际UV),片段着色器中需转换: ```hlsl float2 uv = i.screenUV.xy / i.screenUV.w; ``` 3. **Unity版本适配** 若使用URP/HDRP,需替换`ComputeScreenPos`为: ```hlsl #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl" o.screenUV = ComputeScreenPos(TransformWorldToHClip(v.vertex), _ProjectionParams.x); ``` > ⚠️ **若仍报错**:检查第118行附近的代码,确认访问的结构体变量名与定义完全一致(包括大小写)。 --- ### 相关问题 1. Unity Shader中`TEXCOORD`语义的最大支持数量是多少? 2. 如何在URP中正确计算屏幕空间坐标? 3. `ComputeScreenPos`函数在不同Unity渲染管线中的区别? 4. Unity Shader结构体成员定义的最佳实践有哪些? 5. 如何调试Unity Shader的编译错误日志? [^1]: 无效下标错误通常由结构体成员未定义引起 [^2]: 变量命名不一致或语义缺失会导致编译失败 [^3]: 重新导入Shader可解决Unity缓存导致的异常 [^4]: 结构体成员访问需严格匹配定义
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值