diff --git a/src/gl/data/gl_vertexbuffer.cpp b/src/gl/data/gl_vertexbuffer.cpp index f68883edf6..854750ecbf 100644 --- a/src/gl/data/gl_vertexbuffer.cpp +++ b/src/gl/data/gl_vertexbuffer.cpp @@ -90,27 +90,11 @@ void FVertexBuffer::BindVBO() FFlatVertexBuffer::FFlatVertexBuffer() : FVertexBuffer() { - if (gl.flags & RFL_BUFFER_STORAGE) - { - unsigned int bytesize = BUFFER_SIZE * sizeof(FFlatVertex); - glBindBuffer(GL_ARRAY_BUFFER, vbo_id); - glBufferStorage(GL_ARRAY_BUFFER, bytesize, NULL, GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT); - map = (FFlatVertex*)glMapBufferRange(GL_ARRAY_BUFFER, 0, bytesize, GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT); - mNumReserved = mIndex = mCurIndex = 0; - } - else - { - vbo_shadowdata.Reserve(BUFFER_SIZE); - map = &vbo_shadowdata[0]; - - for (int i = 0; i < 20; i++) - { - map[i].Set(0, 0, 0, 100001.f, i); - } - glBindBuffer(GL_ARRAY_BUFFER, vbo_id); - glBufferData(GL_ARRAY_BUFFER, BUFFER_SIZE * sizeof(FFlatVertex), map, GL_STREAM_DRAW); - mNumReserved = mIndex = mCurIndex = 20; - } + unsigned int bytesize = BUFFER_SIZE * sizeof(FFlatVertex); + glBindBuffer(GL_ARRAY_BUFFER, vbo_id); + glBufferStorage(GL_ARRAY_BUFFER, bytesize, NULL, GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT); + map = (FFlatVertex*)glMapBufferRange(GL_ARRAY_BUFFER, 0, bytesize, GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT); + mNumReserved = mIndex = mCurIndex = 0; glBindVertexArray(vao_id); glBindBuffer(GL_ARRAY_BUFFER, vbo_id); @@ -128,101 +112,6 @@ FFlatVertexBuffer::~FFlatVertexBuffer() glBindBuffer(GL_ARRAY_BUFFER, 0); } -//========================================================================== -// -// Renders the buffer's contents with immediate mode functions -// This is here so that the immediate mode fallback does not need -// to double all rendering code and can instead reuse the buffer-based version -// -//========================================================================== - -CUSTOM_CVAR(Int, gl_rendermethod, 0, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_NOINITCALL) -{ - int newself = self; - if (newself < 0) newself = 0; - if (newself == 0 && (gl.flags & RFL_COREPROFILE)) newself = 1; - if (newself > 3) newself = 3; -} - -void FFlatVertexBuffer::ImmRenderBuffer(unsigned int primtype, unsigned int offset, unsigned int count) -{ - // this will only get called if we can't acquire a persistently mapped buffer. - // Any of the provided methods are rather shitty, with immediate mode being the most reliable across different hardware. - // Still, allow this to be set per CVAR, just in case. Fortunately for newer hardware all this nonsense is not needed anymore. - switch (gl_rendermethod) - { - case 0: - // trusty old immediate mode -#ifndef CORE_PROFILE - if (!(gl.flags & RFL_COREPROFILE)) - { - glBegin(primtype); - for (unsigned int i = 0; i < count; i++) - { - glVertexAttrib2fv(VATTR_TEXCOORD, &map[offset + i].u); - glVertexAttrib3fv(VATTR_VERTEX, &map[offset + i].x); - } - glEnd(); - break; - } -#endif - case 1: - // uniform array - if (count > 20) - { - int start = offset; - FFlatVertex ff = map[offset]; - while (count > 20) - { - - if (primtype == GL_TRIANGLE_FAN) - { - // split up the fan into multiple sub-fans - map[offset] = map[start]; - glUniform1fv(GLRenderer->mShaderManager->GetActiveShader()->fakevb_index, 20 * 5, &map[offset].x); - glDrawArrays(primtype, 0, 20); - offset += 18; - count -= 18; - } - else - { - // we only have triangle fans of this size so don't bother with strips and triangles here. - break; - } - } - map[offset] = map[start]; - glUniform1fv(GLRenderer->mShaderManager->GetActiveShader()->fakevb_index, count * 5, &map[offset].x); - glDrawArrays(primtype, 0, count); - map[offset] = ff; - } - else - { - glUniform1fv(GLRenderer->mShaderManager->GetActiveShader()->fakevb_index, count * 5, &map[offset].x); - glDrawArrays(primtype, 0, count); - } - break; - - case 2: - // glBufferSubData - glBindBuffer(GL_ARRAY_BUFFER, vbo_id); - glBufferSubData(GL_ARRAY_BUFFER, offset * sizeof(FFlatVertex), count * sizeof(FFlatVertex), &vbo_shadowdata[offset]); - glDrawArrays(primtype, offset, count); - break; - - case 3: - // glMapBufferRange - glBindBuffer(GL_ARRAY_BUFFER, vbo_id); - void *p = glMapBufferRange(GL_ARRAY_BUFFER, offset * sizeof(FFlatVertex), count * sizeof(FFlatVertex), GL_MAP_UNSYNCHRONIZED_BIT | GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT); - if (p != NULL) - { - memcpy(p, &vbo_shadowdata[offset], count * sizeof(FFlatVertex)); - glUnmapBuffer(GL_ARRAY_BUFFER); - glDrawArrays(primtype, offset, count); - } - break; - } -} - //========================================================================== // // Initialize a single vertex @@ -390,11 +279,6 @@ void FFlatVertexBuffer::UpdatePlaneVertices(sector_t *sec, int plane) if (plane == sector_t::floor && sec->transdoor) vt->z -= 1; mapvt->z = vt->z; } - if (!(gl.flags & RFL_BUFFER_STORAGE)) - { - glBindBuffer(GL_ARRAY_BUFFER, vbo_id); - glBufferSubData(GL_ARRAY_BUFFER, startvt * sizeof(FFlatVertex), countvt * sizeof(FFlatVertex), &vbo_shadowdata[startvt]); - } } //========================================================================== @@ -405,32 +289,10 @@ void FFlatVertexBuffer::UpdatePlaneVertices(sector_t *sec, int plane) void FFlatVertexBuffer::CreateVBO() { - if (!(gl.flags & RFL_NOBUFFER)) - { - vbo_shadowdata.Resize(mNumReserved); - CreateFlatVBO(); - mCurIndex = mIndex = vbo_shadowdata.Size(); - if (gl.flags & RFL_BUFFER_STORAGE) - { - memcpy(map, &vbo_shadowdata[0], vbo_shadowdata.Size() * sizeof(FFlatVertex)); - } - else - { - glBindBuffer(GL_ARRAY_BUFFER, vbo_id); - glBufferSubData(GL_ARRAY_BUFFER, mNumReserved * sizeof(FFlatVertex), (mIndex - mNumReserved) * sizeof(FFlatVertex), &vbo_shadowdata[mNumReserved]); - } - } - else if (sectors) - { - // set all VBO info to invalid values so that we can save some checks in the rendering code - for(int i=0;iGetHeightSec(); - if (hs != NULL) CheckPlanes(hs); - for(unsigned i = 0; i < sector->e->XFloor.ffloors.Size(); i++) - CheckPlanes(sector->e->XFloor.ffloors[i]->model); - } + CheckPlanes(sector); + sector_t *hs = sector->GetHeightSec(); + if (hs != NULL) CheckPlanes(hs); + for(unsigned i = 0; i < sector->e->XFloor.ffloors.Size(); i++) + CheckPlanes(sector->e->XFloor.ffloors[i]->model); } \ No newline at end of file diff --git a/src/gl/data/gl_vertexbuffer.h b/src/gl/data/gl_vertexbuffer.h index b6d61f2da1..de61fb7cb4 100644 --- a/src/gl/data/gl_vertexbuffer.h +++ b/src/gl/data/gl_vertexbuffer.h @@ -83,14 +83,7 @@ public: void RenderArray(unsigned int primtype, unsigned int offset, unsigned int count) { drawcalls.Clock(); - if (gl.flags & RFL_BUFFER_STORAGE) - { - glDrawArrays(primtype, offset, count); - } - else - { - ImmRenderBuffer(primtype, offset, count); - } + glDrawArrays(primtype, offset, count); drawcalls.Unclock(); } diff --git a/src/gl/dynlights/gl_lightbuffer.cpp b/src/gl/dynlights/gl_lightbuffer.cpp index b91b0fe559..c507b1657d 100644 --- a/src/gl/dynlights/gl_lightbuffer.cpp +++ b/src/gl/dynlights/gl_lightbuffer.cpp @@ -64,18 +64,10 @@ FLightBuffer::FLightBuffer() glGenBuffers(1, &mBufferId); glBindBuffer(mBufferType, mBufferId); unsigned int bytesize = BUFFER_SIZE * 4 * sizeof(float); - if (gl.flags & RFL_BUFFER_STORAGE) - { - glBufferStorage(mBufferType, bytesize, NULL, GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT); - void *map = glMapBufferRange(mBufferType, 0, bytesize, GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT); - mBufferPointer = (float*)map; - glBindBufferBase(mBufferType, LIGHTBUF_BINDINGPOINT, mBufferId); - } - else - { - glBufferData(mBufferType, bytesize, NULL, GL_STREAM_DRAW); - mBufferPointer = NULL; - } + glBufferStorage(mBufferType, bytesize, NULL, GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT); + void *map = glMapBufferRange(mBufferType, 0, bytesize, GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT); + mBufferPointer = (float*)map; + glBindBufferBase(mBufferType, LIGHTBUF_BINDINGPOINT, mBufferId); Clear(); mLastMappedIndex = UINT_MAX; @@ -109,15 +101,7 @@ int FLightBuffer::UploadLights(FDynLightData &data) float *copyptr; - if (mBufferPointer != NULL) - { - copyptr = mBufferPointer + mIndex * 4; - } - else - { - unsigned int pos = mBufferArray.Reserve(totalsize * 4); - copyptr = &mBufferArray[pos]; - } + copyptr = mBufferPointer + mIndex * 4; float parmcnt[] = { 0, size0, size0 + size1, size0 + size1 + size2 }; @@ -126,12 +110,6 @@ int FLightBuffer::UploadLights(FDynLightData &data) memcpy(©ptr[4 + 4*size0], &data.arrays[1][0], 4 * size1*sizeof(float)); memcpy(©ptr[4 + 4*(size0 + size1)], &data.arrays[2][0], 4 * size2*sizeof(float)); - if (mBufferPointer == NULL) // if we can't persistently map the buffer we need to upload it after all lights have been added. - { - glBindBuffer(mBufferType, mBufferId); - glBufferSubData(mBufferType, mIndex, totalsize * 4 * sizeof(float), copyptr); - } - unsigned int bufferindex = mIndex; mIndex += totalsize; draw_dlight += (totalsize-1) / 2; @@ -140,13 +118,6 @@ int FLightBuffer::UploadLights(FDynLightData &data) void FLightBuffer::Finish() { - /* - if (!(gl.flags & RFL_BUFFER_STORAGE)) // if we can't persistently map the buffer we need to upload it after all lights have been added. - { - glBindBuffer(mBufferType, mBufferId); - glBufferSubData(mBufferType, 0, mBufferArray.Size() * sizeof(float), &mBufferArray[0]); - } - */ Clear(); } diff --git a/src/gl/shaders/gl_shader.cpp b/src/gl/shaders/gl_shader.cpp index 00683dd207..a1a22e7707 100644 --- a/src/gl/shaders/gl_shader.cpp +++ b/src/gl/shaders/gl_shader.cpp @@ -94,17 +94,11 @@ bool FShader::Load(const char * name, const char * vert_prog_lump, const char * if (lightbuffertype == GL_UNIFORM_BUFFER) { - vp_comb.Format("#version 130\n#extension GL_ARB_uniform_buffer_object : require\n#define NUM_UBO_LIGHTS %d\n", lightbuffersize); + vp_comb.Format("#version 330 core\n#extension GL_ARB_uniform_buffer_object : require\n#define NUM_UBO_LIGHTS %d\n", lightbuffersize); } else { - vp_comb = "#version 400 compatibility\n#extension GL_ARB_shader_storage_buffer_object : require\n#define SHADER_STORAGE_LIGHTS\n"; - } - - if (!(gl.flags & RFL_BUFFER_STORAGE)) - { - // we only want the uniform array hack in the shader if we actually need it. - vp_comb << "#define UNIFORM_VB\n"; + vp_comb = "#version 400 core\n#extension GL_ARB_shader_storage_buffer_object : require\n#define SHADER_STORAGE_LIGHTS\n"; } vp_comb << defines << i_data.GetString().GetChars(); @@ -306,7 +300,7 @@ FShader *FShaderManager::Compile (const char *ShaderName, const char *ShaderPath void FShader::ApplyMatrices(VSMatrix *proj, VSMatrix *view) { - if (gl.flags & RFL_SEPARATE_SHADER_OBJECTS) + if (gl.flags & RFL_SEPARATE_SHADER_OBJECTS) // this check is just for safety. All supported hardware reports this extension as being present. { glProgramUniformMatrix4fv(hShader, projectionmatrix_index, 1, false, proj->get()); glProgramUniformMatrix4fv(hShader, viewmatrix_index, 1, false, view->get()); diff --git a/src/gl/system/gl_interface.cpp b/src/gl/system/gl_interface.cpp index ee30084f08..2f9425fe9a 100644 --- a/src/gl/system/gl_interface.cpp +++ b/src/gl/system/gl_interface.cpp @@ -52,8 +52,6 @@ RenderContext gl; int occlusion_type=0; -CVAR(Bool, gl_persistent_avail, false, CVAR_NOSET); - //========================================================================== // // @@ -118,11 +116,10 @@ void gl_LoadExtensions() if (version == NULL) version = (const char*)glGetString(GL_VERSION); else Printf("Emulating OpenGL v %s\n", version); - // Don't even start if it's lower than 3.0 - if (strcmp(version, "3.0") < 0) + if (strcmp(version, "3.3") < 0 || !CheckExtension("GL_ARB_buffer_storage")) { - I_FatalError("Unsupported OpenGL version.\nAt least GL 3.0 is required to run " GAMENAME ".\n"); + I_FatalError("Unsupported OpenGL version.\nAt least OpenGL 3.3 and the »GL_ARB_buffer_storage« extension is required to run " GAMENAME ".\n"); } // add 0.01 to account for roundoff errors making the number a tad smaller than the actual version @@ -134,16 +131,8 @@ void gl_LoadExtensions() if (CheckExtension("GL_ARB_texture_compression")) gl.flags|=RFL_TEXTURE_COMPRESSION; if (CheckExtension("GL_EXT_texture_compression_s3tc")) gl.flags|=RFL_TEXTURE_COMPRESSION_S3TC; if (CheckExtension("GL_ARB_shader_storage_buffer_object")) gl.flags |= RFL_SHADER_STORAGE_BUFFER; - if (CheckExtension("GL_ARB_buffer_storage") && !Args->CheckParm("-nopersistentbuffers")) - { - gl.flags |= RFL_BUFFER_STORAGE; // the cmdline option is for testing the fallback implementation on newer hardware. - gl_persistent_avail = true; - } if (CheckExtension("GL_ARB_separate_shader_objects")) gl.flags |= RFL_SEPARATE_SHADER_OBJECTS; - if (!CheckExtension("GL_ARB_compatibility")) gl.flags |= RFL_COREPROFILE; - if (!(gl.flags & (RFL_COREPROFILE|RFL_BUFFER_STORAGE)) && !strstr(gl.vendorstring, "NVIDIA Corporation")) gl.flags |= RFL_NOBUFFER; - glGetIntegerv(GL_MAX_TEXTURE_SIZE,&gl.max_texturesize); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); } diff --git a/src/gl/system/gl_interface.h b/src/gl/system/gl_interface.h index 9a5c18ac4c..fbafc7ca6a 100644 --- a/src/gl/system/gl_interface.h +++ b/src/gl/system/gl_interface.h @@ -10,11 +10,8 @@ enum RenderFlags RFL_TEXTURE_COMPRESSION_S3TC=2, RFL_SEPARATE_SHADER_OBJECTS = 4, // we need this extension for glProgramUniform. On hardware not supporting it we need some rather clumsy workarounds - RFL_BUFFER_STORAGE = 8, // allows persistently mapped buffers, which are the only efficient way to actually use a dynamic vertex buffer. If this isn't present, a workaround with uniform arrays is used. RFL_SHADER_STORAGE_BUFFER = 16, // to be used later for a parameter buffer RFL_BASEINDEX = 32, // currently unused - RFL_COREPROFILE = 64, - RFL_NOBUFFER = 128, // the static buffer makes no sense on GL 3.x AMD and Intel hardware, as long as compatibility mode is on }; enum TexMode diff --git a/src/gl/textures/gl_bitmap.cpp b/src/gl/textures/gl_bitmap.cpp index c37e7a90eb..0c74c9ae70 100644 --- a/src/gl/textures/gl_bitmap.cpp +++ b/src/gl/textures/gl_bitmap.cpp @@ -55,34 +55,17 @@ void iCopyColors(unsigned char * pout, const unsigned char * pin, bool alphatex, { int i; - if (!alphatex || gl.version >= 3.3f) // GL 3.3+ uses a GL_R8 texture for alpha textures so the channels can remain as they are. + for(i=0;i 0) diff --git a/src/gl/textures/gl_hwtexture.cpp b/src/gl/textures/gl_hwtexture.cpp index 98229a1cab..697bcda4d5 100644 --- a/src/gl/textures/gl_hwtexture.cpp +++ b/src/gl/textures/gl_hwtexture.cpp @@ -191,17 +191,7 @@ void FHardwareTexture::LoadImage(unsigned char * buffer,int w, int h, unsigned i if (alphatexture) { - // thanks to deprecation and delayed introduction of a suitable replacement feature this has become a bit messy... - // Of all the targeted hardware, the Intel GMA 2000 and 3000 are the only ones not supporting texture swizzle, and they - // are also the only ones not supoorting GL 3.3. On those we are forced to use a full RGBA texture here. - if (gl.version >= 3.3f) - { - texformat = GL_R8; - } - else - { - texformat = GL_RGBA8; - } + texformat = GL_R8; } else if (forcenocompression) { @@ -246,7 +236,7 @@ void FHardwareTexture::LoadImage(unsigned char * buffer,int w, int h, unsigned i if (deletebuffer) free(buffer); if (mipmap && use_mipmapping && !forcenofiltering) glGenerateMipmap(GL_TEXTURE_2D); - if (alphatexture && gl.version >= 3.3f) + if (alphatexture) { static const GLint swizzleMask[] = {GL_ONE, GL_ONE, GL_ONE, GL_RED}; glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask); diff --git a/src/win32/win32gliface.cpp b/src/win32/win32gliface.cpp index a0e55d6733..ab6d152545 100644 --- a/src/win32/win32gliface.cpp +++ b/src/win32/win32gliface.cpp @@ -740,14 +740,9 @@ bool Win32GLVideo::InitHardware (HWND Window, int multisample) m_hRC = NULL; if (myWglCreateContextAttribsARB != NULL) { -#ifndef CORE_PROFILE - bool core = !!Args->CheckParm("-core"); -#else - bool core = true; -#endif // let's try to get the best version possible. Some drivers only give us the version we request // which breaks all version checks for feature support. The highest used features we use are from version 4.4, and 3.0 is a requirement. - static int versions[] = { 44, 43, 42, 41, 40, 33, 32, 30, -1 }; + static int versions[] = { 44, 43, 42, 41, 40, 33, -1 }; for (int i = 0; versions[i] > 0; i++) { @@ -755,7 +750,7 @@ bool Win32GLVideo::InitHardware (HWND Window, int multisample) WGL_CONTEXT_MAJOR_VERSION_ARB, versions[i] / 10, WGL_CONTEXT_MINOR_VERSION_ARB, versions[i] % 10, WGL_CONTEXT_FLAGS_ARB, gl_debug ? WGL_CONTEXT_DEBUG_BIT_ARB : 0, - WGL_CONTEXT_PROFILE_MASK_ARB, core? WGL_CONTEXT_CORE_PROFILE_BIT_ARB : WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB, + WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_CORE_PROFILE_BIT_ARB, 0 }; @@ -763,11 +758,6 @@ bool Win32GLVideo::InitHardware (HWND Window, int multisample) if (m_hRC != NULL) break; } } - if (m_hRC == 0) - { - // If we are unable to get a core context, let's try whatever the system gives us. - m_hRC = wglCreateContext(m_hDC); - } if (m_hRC == NULL) { diff --git a/wadsrc/static/menudef.z b/wadsrc/static/menudef.z index e448e42d98..cdfce41450 100644 --- a/wadsrc/static/menudef.z +++ b/wadsrc/static/menudef.z @@ -124,14 +124,6 @@ OptionValue "FuzzStyle" //5, "Jagged fuzz" I can't see any difference between this and 4 so it's disabled for now. } -OptionValue "RenderMethods" -{ - 0, "Immediate mode" - 1, "Uniform array" - 2, "Buffer upload" - 3, "Mapped buffer" -} - OptionMenu "GLTextureGLOptions" { Title "TEXTURE OPTIONS" @@ -180,7 +172,6 @@ OptionMenu "GLPrefOptions" Option "Particle style", gl_particles_style, "Particles" Slider "Ambient light level", gl_light_ambient, 1.0, 255.0, 5.0 Option "Rendering quality", gl_render_precise, "Precision" - Option "Render method", gl_rendermethod, "RenderMethods", "gl_persistent_avail" } OptionMenu "OpenGLOptions" diff --git a/wadsrc/static/shaders/glsl/main.vp b/wadsrc/static/shaders/glsl/main.vp index e355141f0c..16c3c8738e 100644 --- a/wadsrc/static/shaders/glsl/main.vp +++ b/wadsrc/static/shaders/glsl/main.vp @@ -11,34 +11,12 @@ out vec2 glowdist; out vec4 vTexCoord; out vec4 vColor; -#ifdef UNIFORM_VB -uniform float fakeVB[100]; -#endif - void main() { - vec4 vert; - vec4 tc; - -#ifdef UNIFORM_VB - - if (aTexCoord.x >= 100000.0) - { - int fakeVI = int(aTexCoord.y)*5; - vert = aPosition + vec4(fakeVB[fakeVI], fakeVB[fakeVI+1], fakeVB[fakeVI+2], 0.0); - tc = vec4(fakeVB[fakeVI+3], fakeVB[fakeVI+4], 0.0, 0.0); - } - else -#endif - { - vert = aPosition; - tc = vec4(aTexCoord, 0.0, 0.0); - } - #ifndef SIMPLE - vec4 worldcoord = ModelMatrix * mix(vert, aVertex2, uInterpolationFactor); + vec4 worldcoord = ModelMatrix * mix(aPosition, aVertex2, uInterpolationFactor); #else - vec4 worldcoord = ModelMatrix * vert; + vec4 worldcoord = ModelMatrix * aPosition; #endif vec4 eyeCoordPos = ViewMatrix * worldcoord; @@ -55,13 +33,13 @@ void main() #ifdef SPHEREMAP vec3 u = normalize(eyeCoordPos.xyz); - vec4 n = normalize(TextureMatrix * vec4(tc.x, 0.0, tc.y, 0.0)); // use texture matrix and coordinates for our normal. Since this is only used on walls, the normal's y coordinate is always 0. + vec4 n = normalize(TextureMatrix * vec4(aTexCoord.x, 0.0, aTexCoord.y, 0.0)); // use texture matrix and coordinates for our normal. Since this is only used on walls, the normal's y coordinate is always 0. vec3 r = reflect(u, n.xyz); float m = 2.0 * sqrt( r.x*r.x + r.y*r.y + (r.z+1.0)*(r.z+1.0) ); vec2 sst = vec2(r.x/m + 0.5, r.y/m + 0.5); vTexCoord.xy = sst; #else - vTexCoord = TextureMatrix * tc; + vTexCoord = TextureMatrix * vec4(aTexCoord, 0.0, 0.0); #endif gl_Position = ProjectionMatrix * eyeCoordPos;