是否可以将我的3D模型导出或转换为GLSL ES 2.0?对于像Blender/3DS MAX/Maya这样创建GLSL ES 2.0代码的编辑程序,是否有任何转换器或任何导出工具/插件?
我想在上面提到的任何编辑器中方便地创建我的模型,然后我想将它们导出/转换为GLSL ES 2.0.
我已经有一个显示着色器的模板WebGL代码.我想用转换器或导出工具自动创建的GLSL ES代码替换片段着色器和顶点着色器部件.
我想做这样的事情(但对于GLSL ES 2.0): Blender到GLSL
我正在使用OpenGL,并且我正在使用的版本存在一些问题.当我检查我的版本时glGetString(GL_VERSION),我得到"4.2.0 - Build 10.18.10.3574".我有以下问题:
在一种方法中,我使用固定管道进行渲染,但我知道从OpenGL 3.1中删除了对固定管道的支持,那么我的代码如何与4.2一起工作?我使用的API一样glTranslatef(),glMatrixMode(GL_PROJECTION).我认为这些都已弃用,仅适用于OpenGL 1.1.那么当我将上下文字符串作为OpenGL 4.2时,代码是如何工作的?我想我必须使用OpenGL 1.1,但为什么上下文版本是4.2?
当我使用着色器时,我使用以下代码创建3.1或更高版本的上下文.我使用的着色器是旧的着色器,它与OpenGL 2.0兼容,并且具有"属性","变化"等关键字,不应与OpenGL 3.1或更高版本一起使用.我应该将我的着色器更新为OpenGLSL 3.1,比如使用"in","out"等.还有一些不赞成的东西,比如GL_LINE_SMOOTH_HINT,glMatrixMode(GL_PROJECTION).我认为这些东西已经从OpenGL 3.0中弃用了.那么这些东西如何与GL上下文3.1及更高版本一起使用?
创建上下文3.1或更高版本的代码
if ( 0 == (m_tempContext = ::wglCreateContext( m_pDC->GetSafeHdc() ) ) )
{
AfxMessageBox(_T("wglCreateContext failed."));
return FALSE;
}
if ( FALSE == ::wglMakeCurrent( m_pDC->GetSafeHdc(), m_tempContext ) )
{
AfxMessageBox(_T("wglMakeCurrent failed."));
return FALSE;
}
int attribs[] =
{
WGL_CONTEXT_MAJOR_VERSION_ARB, 3,
WGL_CONTEXT_MINOR_VERSION_ARB, 1,
WGL_CONTEXT_FLAGS_ARB, 0,
0
};
if(wglewIsSupported("WGL_ARB_create_context") == 1)
{
m_hRC = wglCreateContextAttribsARB(m_pDC->GetSafeHdc() ,0, attribs); …Run Code Online (Sandbox Code Playgroud) 以下片段着色器有什么问题?它可以在GLSL 4.0下编译正常,但在GLSL 1.30上失败。
这是代码:
// Fragment Shader
"uniform sampler2D texture;\n"
"uniform sampler1D cmap;\n"
"uniform float minZ;\n"
"uniform float maxZ;\n"
"\n"
"void main() {\n"
" float height = texture2D(texture,gl_TexCoord[0].st);\n"
" float lum = (height-minZ)/(maxZ-minZ);\n"
" if (lum > 1.0) lum = 1.0;\n"
" else if (lum < 0.0) lum = 0.0;\n"
" gl_FragColor = texture1D(cmap, lum);\n"
"}"
Run Code Online (Sandbox Code Playgroud)
这些是错误:
FRAGMENT glCompileShader "" FAILED
FRAGMENT Shader "" infolog:
0:7(2): error: initializer of type vec4 cannot be assigned to variable of type float
0:8(2): …Run Code Online (Sandbox Code Playgroud) 我有一个相当简单的顶点着色器:
#version 330 core
layout (location = 0) in vec2 position;
layout (location = 1) in vec2 uvCoord;
uniform mat4 view;
uniform mat4 projection;
out vec2 _uvCoord;
void main()
{
gl_Position = projection * view * vec4(position, 1.0);
_uvCoord = uvCoord;
}
Run Code Online (Sandbox Code Playgroud)
这是给出错误:
ERROR: 0:13: error(#174) Not enough data provided for construction constructor
ERROR: error(#273) 1 compilation errors. No code generated
Run Code Online (Sandbox Code Playgroud)
我曾尝试在谷歌上搜索导致此类错误的原因,但无济于事。失败了,我仔细查看了着色器代码,但据我所知,它没有问题。
是什么导致了这种错误,我该如何修复这个着色器?
我在将等距柱状图全景图像映射到简单平面上时遇到了很多麻烦。到目前为止,我的映射是正确的,所以一切都准确地显示在它应该的位置。但我的问题是,在我的纹理坐标从 1 跳到 0 的地方有一条线。但那条线不仅仅是一些线。它的像素比普通像素大一倍。我将它直接渲染到我的屏幕上,中间没有帧缓冲区。我试图启用多重采样,但它根本不影响那条线。我也试图通过将它隐藏在我的相机后面来摆脱那条线,但后来我意识到当我抬头时,无论我在哪里转动它,总会有这条线。在我的代码中,当我使用例如“if”或“atan”进行纹理坐标跳转时,总是显示这一行。
我想在glsl中使用Light结构,并将它们的数组定义为一个统一变量,如下所示:
uniform Light lights[LIGHT_NUM];
Run Code Online (Sandbox Code Playgroud)
不幸的是,我无法找到使用此功能的OpenGL/glsl/GL ES版本.