GLSL早期版本中变量Varying的Out作用解析

版权申诉
0 下载量 99 浏览量 更新于2024-12-10 收藏 3KB RAR 举报
资源摘要信息: "erase_iter_iter.rar_out" 标题分析: 标题 "erase_iter_iter.rar_out" 表示一个经过压缩的资源文件,其以 "rar" 为压缩格式后缀。虽然标题没有直接提供具体的IT知识点,但结合描述部分,可以推断出该文件可能与编程语言中的变量类型或者GLSL(OpenGL Shading Language)有关。 描述分析: 描述中提到了“GLSL”和“Varying”以及“Attribute”这两个概念,它们都与OpenGL图形编程紧密相关。GLSL是用于在OpenGL应用程序中编写着色器的专用编程语言。早期版本的GLSL中有“Varying”和“Attribute”这两个限定符,但在后续版本中,它们被废弃了。尽管如此,了解这些概念对于理解着色器中的变量传递依然非常重要,特别是当需要判断一个“Varying”变量应该被视为输入(In)还是输出(Out)时。 从描述中可以提取的关键知识点包括: 1. GLSL (OpenGL Shading Language) - GLSL是OpenGL的官方着色器语言,用于在图形处理单元(GPU)上编写可编程的着色器程序。 - 它允许开发者通过各种着色器阶段(如顶点着色器、片段着色器等)来控制图形渲染管线的特定部分。 2. Varying和Attribute变量 - 在早期版本的GLSL中,Attribute变量用于从应用程序传递数据到顶点着色器,通常用于顶点的属性数据,如位置、法线、纹理坐标等。 - Varying变量用于在顶点着色器和片段着色器之间传递数据,它们定义了顶点着色器输出和片段着色器输入之间的变量。 - 随着GLSL的发展,这些概念逐渐被in和out限定符所替代,以提供更明确的接口定义。 3. in和out限定符 - 在现代GLSL中,着色器阶段之间传递数据通常会使用in和out限定符。 - 顶点着色器会使用in限定符接收来自Attribute变量的数据,并通过out限定符将数据传递给下一个着色器阶段(如片段着色器)。 - 片段着色器使用in限定符来接收来自顶点着色器的数据。 4. 着色器编程 - 着色器编程是图形编程的核心部分,涉及到图形管线中不同阶段的数据处理。 - 学习着色器编程对于深入理解图形渲染流程是必不可少的。 文件名称分析: 文件列表包含了 "GrGLShaderVar.c" 和 "erase_iter_iter.pass.c"。这两个文件名提示了可能包含C语言编写的代码,以及它们在处理着色器变量时可能扮演的角色。 - "GrGLShaderVar.c" 可能是包含OpenGL着色器变量声明和操作的核心源文件。 - "erase_iter_iter.pass.c" 可能是指一个特定的实现,它可能涉及到遍历或擦除迭代器(iterator)中的某些元素。 结合上述分析,我们可以得出,该资源文件可能涉及到图形编程中的着色器编程,特别是与早期GLSL语法相关的部分。开发者需要了解如何在现代GLSL中处理着色器之间的变量传递,以及如何将旧的语法概念转换为当前标准的实现方式。同时,这些文件可能提供了如何用C语言实现这些概念的代码示例。

uint64_t S1mmeSession::UpdateUserDataSTMSIChange(S1APNode* p_node, uint64_t stmsi) { if(!stmsi) return 0; uint64_t old_stmsi = 0; //如果stmsi没有改变, 则直接返回 SPUserInfo& sp_local_user_info = p_node->GetUserInfo(); if (sp_local_user_info->HasSTMSI() && sp_local_user_info->GetSTMSI() == stmsi) { return old_stmsi; } //删除 old stmsi if (sp_local_user_info->HasSTMSI()) { old_stmsi = sp_local_user_info->GetSTMSI(); STMSI_Iter iter = ue_stmsi_map_.find(old_stmsi); if (iter != ue_stmsi_map_.end()) { ue_stmsi_map_.erase(iter); } DeleteFromStmsiTimeoutMap(old_stmsi); } //删除可能的 paging 干扰 StmsiWithMmegi_T old_stmsi_key(old_stmsi); S1APNode** pp_paging = p_stmsi_paging_map_->GetData(old_stmsi_key); if (pp_paging != NULL) { if (handle_session_version_ == S1MME_SESSION_VERSION_CHINA_TELECOM) { CtOutputNode(*pp_paging, false); } else { (*pp_paging)->DeletePagingKqi(); } p_stmsi_paging_map_->DeleteData(old_stmsi_key, p_s1ap_node_allocator_); } StmsiWithMmegi_T new_stmsi_key(stmsi); pp_paging = p_stmsi_paging_map_->GetData(new_stmsi_key); if (pp_paging != NULL) { if(handle_session_version_ == S1MME_SESSION_VERSION_CHINA_TELECOM) { CtOutputNode(*pp_paging, false); } else { (*pp_paging)->DeletePagingKqi(); } p_stmsi_paging_map_->DeleteData(new_stmsi_key, p_s1ap_node_allocator_); } //删除可能的 new_stmsi 干扰 STMSI_Iter iter = ue_stmsi_map_.find(stmsi); if (iter != ue_stmsi_map_.end()) { iter->second->flag_.stmsi = false; iter->second->index_.stmsi =0; ue_stmsi_map_.erase(iter); } UpdateFromStmsiTimeoutMap(stmsi, current_time_.tv_sec, true); //插入 new_stmsi(local user info) ue_stmsi_map_.insert(std::make_pair(stmsi, sp_local_user_info)); sp_local_user_info->SetSTMSI(stmsi); return old_stmsi; }什么意思

2023-06-11 上传

void Extract1DEdge::GetEdgePoint(int threshold, Translation traslation, Selection selection) { if (m_mInputMat.empty()) { return; } if (m_mInputMat.channels() > 1) { cvtColor(m_mInputMat, m_mInputMat, COLOR_BGR2GRAY); } double* ptr = m_mInputMat.ptr<double>(0); m_vpCandidate.clear(); m_vEdgesResult.clear(); //The theshold condition is met for (int i = 0; i < m_mInputMat.cols; i++) { double dGradient = abs(ptr[i]); if (dGradient >= threshold) { m_vpCandidate.push_back(Point2d(i, ptr[i])); } } if (m_vpCandidate.size() == 0) { return; } //The translation condition is met if (traslation == Translation::Poisitive)// from dark to light: f'(x)>0 { for (vector<Point2d>::iterator iter = m_vpCandidate.begin(); iter != m_vpCandidate.end();) { if ((*iter).y <= 0) { //cout << "Negative Edge: " << (*iter).y << endl; iter = m_vpCandidate.erase(iter); } else { iter++; } } } else if (traslation == Translation::Negative) { for (vector<Point2d>::iterator iter = m_vpCandidate.begin(); iter != m_vpCandidate.end();) { if ((*iter).y > 0) { iter = m_vpCandidate.erase(iter); } else { iter++; } } } if (m_vpCandidate.size() == 0) { return; } //The selection condition is met if (selection == Selection::Fisrt) { m_vpCandidate.erase(m_vpCandidate.begin() + 1, m_vpCandidate.end()); } else if (selection == Selection::Last) { m_vpCandidate.erase(m_vpCandidate.begin(), m_vpCandidate.end() - 1); } else if (selection == Selection::Strongest) { Point2d pdMax(0, 0); double dGradientMax = 0; for(Point2d item: m_vpCandidate) { if (abs(item.y) >= dGradientMax) { pdMax = item; dGradientMax = abs(item.y); } } m_vpCandidate.clear(); m_vpCandidate.push_back(pdMax); } else if (selection == Selection::weakest) { Point2d pdMin(0, 99999999); for (Point2d item : m_vpCandidate) { if (abs(item.y) <= pdMin.y) { pdMin.y = abs(item.y); pdMin.x = item.x; } } m_vpCandidate.clear(); m_vpCandidate.push_back(pdMin); } double dEdgex = 0, dEdgey = 0; for (Point2d item : m_vpCandidate) { if (isinf(m_dK)) { dEdgex = m_pdStart.x; dEdgey = m_pdStart.y + sin(to_radian(m_dAngle)) * item.x; } else { dEdgex = m_pdStart.x + item.x * cos(to_radian(m_dAngle)); dEdgey = m_dK * dEdgex + m_dB; } m_vEdgesResult.push_back(Edge1D_Result(Point2d(dEdgex, dEdgey), item.y)); } } 使用 OpenCvSharp4.6 编写函数 GetEdgePoint(int threshold, Translation traslation, Selection selection)

2023-06-07 上传